簡體   English   中英

用dplyr匯總和計數R中的數據

[英]Summarize and count data in R with dplyr

目標:匯總/計數發生的dplyr刺激的同一行中的響應。

背景:在另一個主題中,我獲得了一些出色的幫助: 在R中遍歷數據幀並測量兩個值之間的時間差

現在,我正在使用相同/相似的數據集,我的目標是計算與發生刺激的位置相同的行中用戶感知到的刺激的響應。 數據集如下所示:

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行記錄了R7的刺激。 然后,期望結果的結果是一行,在StimuliA處為1,在R7處為1。 然后它再次開始,因為在第3行中,StimuliA有一個新的1。

最后,對於每個刺激,將在同一行中匯總以下已發生的響應(R2-R7)。 刺激值(A或B)保持為1。

問題:我覺得可以使用dplyr軟件包來實現這一點,但是我以前的嘗試並未得出很多有用的輸出。 如何使用dplyr命令來構造語法,還是應該在另一個方向上尋找解決方案? 我會更改相同的現有數據框還是創建一個新的數據框?

感謝您的所有投入和幫助!

這是基於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM