You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:29:57