在R语言中为数据框添加动态变量:按专利分组计算temp列和
刚好最近经常处理这类分组统计的需求,给你分享两个实用的解决方案,不管你习惯用dplyr(tidyverse生态)还是原生Base R都能完美匹配你的需求~
方法一:使用dplyr(推荐,易读且扩展性强)
如果平时习惯用tidyverse工具链,这个方法最直观,还能轻松应对更多temp列的情况:
library(dplyr) # 先构造你提供的数据 patent <- c(1,2,2) temp1 <- c(TRUE,FALSE,FALSE) temp2 <- c(FALSE,TRUE,TRUE) df <- data.frame(patent,temp1,temp2) # 生成目标新列 df_final <- df %>% group_by(patent) %>% # 按patent分组 mutate( new1 = sum(temp1), # 计算每组temp1的求和 new2 = sum(temp2) # 计算每组temp2的求和 # 🌟 如果你的temp列很多(比如temp1到temp10),可以用across批量处理: # across(starts_with("temp"), ~sum(.), .names = "new{str_remove(col, 'temp')}") # 这样会自动生成new1对应temp1,new2对应temp2...不用手动写每一列 ) %>% ungroup() # 取消分组(可选,看后续需求) print(df_final)
方法二:使用Base R(无需额外包,轻量简洁)
如果不想加载第三方包,用原生的ave函数就能快速实现,它专门用来按分组计算统计量并返回和原数据长度一致的结果:
# 构造数据 patent <- c(1,2,2) temp1 <- c(TRUE,FALSE,FALSE) temp2 <- c(FALSE,TRUE,TRUE) df <- data.frame(patent,temp1,temp2) # 添加新列 df$new1 <- ave(df$temp1, df$patent, FUN = sum) df$new2 <- ave(df$temp2, df$patent, FUN = sum) print(df)
最终输出结果
两种方法都会得到你想要的目标数据框:
patent temp1 temp2 new1 new2 1 1 TRUE FALSE 1 0 2 2 FALSE TRUE 0 2 3 2 FALSE TRUE 0 2
内容的提问来源于stack exchange,提问作者Louis Maiden
相关产品推荐
相关产品推荐

