在R中按ID对指定问题的取值求平均以创建新列
嘿,我来帮你搞定这个按ID计算指定问题平均值的需求!这在R里其实很容易实现,我给你两种常用的方案,你可以根据自己的习惯选:
方法1:用dplyr包(推荐,代码更直观易读)
如果你平时习惯用tidyverse系列的工具,这个方法会很顺手。先确保你装了dplyr包,没装的话先跑install.packages("dplyr")安装:
library(dplyr) # 先模拟你的原始数据框(你可以替换成自己的真实数据) df <- data.frame( id = c(1,1,1,2,2,2), question = c("abc","def","ghi","abc","def","ghi"), qnumber = c(1,2,3,1,2,3), value = c(1,3,4,2,5,6) ) # 核心操作:按ID分组,添加新列存储q1和q2的平均值 df_with_avg <- df %>% group_by(id) %>% mutate(avg_q1q2 = mean(value[qnumber %in% c(1,2)], na.rm = TRUE)) %>% ungroup() # 查看处理后的数据 print(df_with_avg)
小提示:如果你的数据里question列比qnumber更可靠(比如怕编号对应错),可以把筛选条件换成question %in% c("abc","def"),这样更精准。另外na.rm=TRUE是用来处理可能存在的缺失值,避免计算结果变成NA。
方法2:用Base R(无需额外安装包)
如果不想装新包,用R自带的函数也能实现:
# 同样用上面的示例数据框df # 第一步:按ID分组,计算q1和q2的平均值 avg_values <- tapply( X = df$value[df$qnumber %in% c(1,2)], INDEX = df$id[df$qnumber %in% c(1,2)], FUN = mean, na.rm = TRUE ) # 第二步:把平均值匹配到原数据框的新列里 df$avg_q1q2 <- avg_values[as.character(df$id)] # 查看结果 print(df)
这个方法里tapply负责分组计算,之后通过ID匹配把平均值赋值给每一行的新列,效果和第一种方法完全一样。
内容的提问来源于stack exchange,提问作者melbez
相关产品推荐
相关产品推荐

