如何创建一个新列,并根据两列中的行的条件分配值?

问题描述 投票:0回答:0

我是 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")
r for-loop if-statement dplyr mutate
© www.soinside.com 2019 - 2024. All rights reserved.