目标:使用dplyr对发生的刺激的同一行中的响应进行汇总/计数。
背景:我在另一个主题上得到了一些很好的帮助:Loop through dataframe in R and measure time difference between two values
现在,我正在处理相同/类似的数据集,我的目标是计算与刺激发生位置相同的行中用户的感知刺激的响应。数据集如下所示:
structure(list(User = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), StimuliA = c(1L, 0L,
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L,
0L, 0L), StimuliB = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), R2 = c(0L, 0L, 0L, 0L,
0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L
), R3 = c(0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L), R4 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), R5 = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L), R6 = c(0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), R7 = c(0L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("User",
"StimuliA", "StimuliB", "R2", "R3", "R4", "R5", "R6", "R7"), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -20L), spec = structure(list(
cols = structure(list(User = structure(list(), class = c("collector_integer",
"collector")), StimuliA = structure(list(), class = c("collector_integer",
"collector")), StimuliB = structure(list(), class = c("collector_integer",
"collector")), R2 = structure(list(), class = c("collector_integer",
"collector")), R3 = structure(list(), class = c("collector_integer",
"collector")), R4 = structure(list(), class = c("collector_integer",
"collector")), R5 = structure(list(), class = c("collector_integer",
"collector")), R6 = structure(list(), class = c("collector_integer",
"collector")), R7 = structure(list(), class = c("collector_integer",
"collector"))), .Names = c("User", "StimuliA", "StimuliB",
"R2", "R3", "R4", "R5", "R6", "R7")), default = structure(list(),
class = c("collector_guess",
"collector"))), .Names = c("cols", "default"), class = "col_spec"))
期望的输出:所需的输出将被汇总列表,所有响应聚集在发生的刺激的同一行中:
U StimuliA StimuliB R2 R3 R4 R5 R6 R7
1 1 0 0 0 0 0 0 1
1 1 0 1 1 0 0 1 0
1 0 1 1 2 0 0 1 0
1 0 1 0 0 0 0 0 0
2 1 0 3 0 0 0 0 0
2 0 1 1 0 0 0 2 0
在样本中,第1行注意到A的刺激和第2行a 1的R7刺激。然后,期望结果中的结果是在StimuliA处具有1并且在R7处具有1的行。然后它再次启动,因为在第3行我们有一个新的1为StimuliA。
最后,对于每个刺激,将在同一行中汇总以下发生的响应(R2-R7)。刺激(A或B)的值保持为1。
问题我觉得我可以使用dplyr软件包实现这一目标,但我以前的尝试并没有得到很多有用的输出。如何使用dplyr命令构造语法,还是应该在另一个方向上搜索解决方案?我会改变相同的现有数据框架还是创建一个新的数据框架?
感谢所有的投入和帮助!
答案 0 :(得分:1)
这是基础R中的双线解决方案。首先,创建一个对每个用户(新)刺激组合唯一的ID。这是通过paste
和cumsum
完成的。
dat$stims <- with(dat, paste(cumsum(StimuliA), cumsum(StimuliB), sep="_"))
然后使用aggregate
计算每个新ID的响应
aggregate(. ~ User + stims, data=dat, sum)
User stims StimuliA StimuliB R2 R3 R4 R5 R6 R7
1 1 1_0 1 0 0 0 0 0 0 1
2 1 2_0 1 0 1 1 0 0 1 0
3 1 2_1 0 1 1 2 0 0 1 0
4 1 2_2 0 1 0 0 0 0 0 0
5 2 3_2 1 0 3 0 0 0 0 0
6 2 3_3 0 1 1 0 0 0 2 0