我是 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
此数据来自一项为期多天的研究,参与者每天都会提供多个回复。 每行反映一个响应。
subj_day 列显示该行反映的响应时该参与者的参与者编号和研究日期。
“done_meditation”中的值指的是参与者在做出回应时是否在当天完成了冥想。如果在完成冥想后提供响应,则 done_meditation = 1。因此,如果参与者在当天完成任何响应之前完成了冥想,则他们当天所有的 done_meditation 行将 = 1.
但是,如果他们在完成冥想之前提供了一些回应,而在完成冥想之后提供了一些回应,则只有一些 done_meditation 行会 = 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
因为参与者 2 仅在 2 个学习日中的 1 个完成冥想,所以他们在每一行中获得 1 分。
因为参与者 1 和 3 在研究的两天内完成了冥想,所以他们在每一行中获得 2 分。
了解实际研究持续 7 天可能会有用,因此参与者的 total_meditations 得分最高可达 7。
我曾尝试编写几个循环但没有成功,并尝试在 dplyr 中使用 group_by 和 mutate 函数但没有成功。我是 R 的新手,一直在努力解决这个问题。
非常感谢您的帮助!
更新: 我想我找到了一个可行的解决方案。以下似乎可以完成这项工作。如果有人有更优雅的解决方案,仍然愿意接受任何新建议 :)
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")