用dplyr汇总和计算R中的数据

时间:2017-07-17 14:37:23

标签: r dplyr

目标:使用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命令构造语法,还是应该在另一个方向上搜索解决方案?我会改变相同的现有数据框架还是创建一个新的数据框架?

感谢所有的投入和帮助!

1 个答案:

答案 0 :(得分:1)

这是基础R中的双线解决方案。首先,创建一个对每个用户(新)刺激组合唯一的ID。这是通过pastecumsum完成的。

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