我有一个长格式的重复测量数据集,类似于:
ID Stimuli Score Correct
<fct> <chr> <int> <int>
1 1 A1 0.046 1
2 1 A1 0.037 1
3 1 A2 -0.261 0
4 1 A2 0.213 0
5 1 A3 0.224 0
6 1 A3 0.001 1
7 2 A1 -1.38 0
8 2 A1 -0.81 0
9 2 A2 -0.03 1
10 2 A2 0.88 0
11 2 A3 -0.00 1
12 2 A3 0.49 0
我根据每行的Score
是否在特定范围内(如果Score介于-之间)创建了Correct
变量。10和+。10 = 1,否则为0)。
我现在想要的是改变Correct
中Stimuli
中每个刺激(A1, A2, A3)和每个ID
数字的值。具体来说,当Correct
的任何一行出现1时,所有值都应该变为1,但仅针对相应的刺激和ID
。换句话说,在上面的例子中,Correct
的第1-2行保持不变(1,1),第3-4行保持不变(0,0),但Stimuli
A3的第5-6行仅为ID
1的1。对于ID 2,唯一的变化是刺激A2(应该变成1,1)。
我已经尝试了几种方法,但我想不出一个简单的方法来做到这一点。有关于替换数据帧中的值的类似帖子,但还没有看到一个我可以通过在同一数据帧内的其他变量中的特定值来做到这一点。
您可以尝试将dplyr::group_by
与any(Correct == 1)
一起使用
library(dplyr)
df %>%
group_by(ID, Stimuli) %>%
mutate(Correct = +any(Correct == 1))
#------
ID Stimuli Score Correct
<int> <chr> <dbl> <dbl>
1 1 A1 0.046 1
2 1 A1 0.037 1
3 1 A2 -0.261 0
4 1 A2 0.213 0
5 1 A3 0.224 1
6 1 A3 0.001 1
7 2 A1 -1.38 0
8 2 A1 -0.81 0
9 2 A2 -0.03 1
10 2 A2 0.88 1
11 2 A3 0 1
12 2 A3 0.49 1
数据df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L, 2L), Stimuli = c("A1", "A1", "A2", "A2", "A3", "A3", "A1",
"A1", "A2", "A2", "A3", "A3"), Score = c(0.046, 0.037, -0.261,
0.213, 0.224, 0.001, -1.38, -0.81, -0.03, 0.88, 0, 0.49), Correct = c(1L,
1L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))
应该也可以,只要
library(dplyr)
df %>%
group_by(ID, Stimuli) %>%
mutate(Correct = max(Correct))