基于日期统计分数≥3的次数并生成新列
基于日期分组统计分数≥3的次数并添加新列
原始数据
ID <- c(1,1,1,1,1,1,1,1,1) date <- c("2020-12-02","2020-12-03","2020-12-04","2020-12-05","2020-12-06","2020-12-07","2020-12-07","2020-12-08","2020-12-08") score <- c(2,5,2,2,3,3,1,1,3) a <- data.frame(ID,date,score)
期望结果
ID <- c(1,1,1,1,1,1,1,1,1) date <- c("2020-12-02","2020-12-03","2020-12-04","2020-12-05","2020-12-06","2020-12-07","2020-12-07","2020-12-08","2020-12-08") score <- c(2,5,2,2,3,3,1,1,3) num_score_greater_than_3 <- c(0,1,0,0,1,1,1,1,1) a <- data.frame(ID,date,score,num_score_greater_than_3)
解决方案
方法1:使用dplyr包(tidyverse风格,简洁易维护)
如果未安装dplyr,先执行安装命令,然后加载包并处理数据:
# 安装包(首次使用时运行) # install.packages("dplyr") library(dplyr) # 分组统计并添加新列 a <- a %>% group_by(date) %>% mutate(num_score_greater_than_3 = sum(score >= 3)) %>% ungroup()
group_by(date):按日期字段分组mutate():在原数据框中新增列,sum(score >=3)统计每组内分数≥3的记录数(逻辑值TRUE等价于1,FALSE等价于0,求和即得到次数)ungroup():取消分组状态,避免后续操作受分组影响
方法2:使用基础R实现(无需额外包)
利用ave()函数直接完成分组统计和赋值:
a$num_score_greater_than_3 <- ave(a$score >= 3, a$date, FUN = sum)
ave()函数会对a$score >=3生成的逻辑向量,按a$date分组后应用sum函数,得到每组的统计值,并将结果匹配回原数据的对应行
内容的提问来源于stack exchange,提问作者Bruh
相关产品推荐
相关产品推荐

