如何在R中基于两列条件创建总冥想天数新列?
问题:为R语言数据框添加基于多列的统计新列
我是R语言初学者,想要创建一个新列,其值由另外两列的行值决定。
我的数据框定义如下:
df <- data.frame(subjectid = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3), subj_day = c("1_1","1_1","1_1","1_2","1_2","2_1","2_1","2_1","2_2","2_2","3_1","3_1","3_1","3_2","3_2"), done_meditation = c(0,0,1,1,1,0,1,1,0,0,1,1,1,1,1))
数据预览:
> df subjectid subj_day done_meditation 1 1 1_1 0 2 1 1_1 0 3 1 1_1 1 4 1 1_2 1 5 1 1_2 1 6 2 2_1 0 7 2 2_1 1 8 2 2_1 1 9 2 2_2 0 10 2 2_2 0 11 3 3_1 1 12 3 3_1 1 13 3 3_1 1 14 3 3_2 1 15 3 3_2 1
数据说明
该数据来自一项多日研究,参与者每天提交多次回复,每行代表一次回复:
subjectid:参与者编号subj_day:参与者编号+研究天数(格式为编号_天数)done_meditation:回复时参与者是否已完成当日冥想(完成后回复为1,否则为0)
需求
创建total_meditations列,记录每个参与者在整个研究期间完成冥想的天数。只要某一天有至少一次回复标记为1,就算该天完成冥想。预期结果如下:
> df subjectid subj_day done_meditation total_meditations 1 1 1_1 0 2 2 1 1_1 0 2 3 1 1_1 1 2 4 1 1_2 1 2 5 1 1_2 1 2 6 2 2_1 0 1 7 2 2_1 1 1 8 2 2_1 1 1 9 2 2_2 0 1 10 2 2_2 0 1 11 3 3_1 1 2 12 3 3_1 1 2 13 3 3_1 1 2 14 3 3_2 1 2 15 3 3_2 1 2
已实现的解法
我尝试过循环和dplyr的group_by+mutate但没成功,目前找到可行方案:
df2 <- df %>% group_by(subjectid, subj_day) %>% summarise(meditationCount = sum(done_meditation)) %>% mutate(meditationCount = ifelse(meditationCount >= 1, 1, 0)) %>% group_by(subjectid) %>% summarise(total_meditations = sum(meditationCount)) merged.df <- merge(df, df2, by = "subjectid")
优化思路
可以用更简洁的dplyr链式操作,无需额外合并步骤:
library(dplyr) df <- df %>% group_by(subjectid, subj_day) %>% mutate(day_completed = any(done_meditation == 1)) %>% # 判断当天是否完成冥想 group_by(subjectid) %>% mutate(total_meditations = sum(day_completed)) %>% # 统计参与者完成的天数 ungroup() %>% select(-day_completed) # 移除中间列
或者用n_distinct结合条件筛选,一步到位:
df <- df %>% group_by(subjectid) %>% mutate(total_meditations = n_distinct(subj_day[done_meditation == 1])) %>% ungroup()
这个思路更直接:对每个参与者,筛选出所有标记为完成冥想的行对应的subj_day,去重后计数,就是完成的天数。
内容的提问来源于stack exchange,提问作者Deanna
相关产品推荐
相关产品推荐

