R中的行到列基于具有汇总统计信息的多个条件

时间:2018-11-09 19:17:32

标签: r

我有以下格式的数据:

ID        Cue       trial     time     accuracy
A         apple     copy      1450     1 
A         dog       copy      2154     1
A         apple     test1     2121     0
A         dog       test2     0        1
A         apple     final     1231     0
A         dog       final     5411     1

我需要将其转换为如下所示:

 ID        Cue       trial     time     accuracy     ID2       Cue2     trial2     time2       accuracy2      ID3       Cue3     trial3     time3       accuracy3
 A         apple     copy      1450     1            A         apple    test1      2121        0              A         apple    final      1231        0 

问题1:

我需要根据匹配的ID和提示将数据的每一行(从长格式)追加到另一行的末尾(至宽格式)(例如,将带有提示“苹果”的参与者A的所有数据放在单行)。

问题2:

行数不是偶数。鉴于我需要偶数列才能进行分析,因此我仅想移动精度为1的“ test1”或“ test2”项。

问题3:

我需要为我附加到第一行末尾的行执行摘要统计(计数/总和)。基本上,我需要知道每个ID和提示组合具有“ test1”或“ test2”的试验的数量(在这种情况下,苹果只有1个test1试验和1个test2试验),并将其放在某个地方的列中。 / p>

简而言之,我在概念上需要这样的东西:

A - apple --> row1 -- row2 -- row3 [summary statistics for # rows test1]
A - dog   --> row1 -- row2 -- row3 [summary statistics for # rows test2]

我有一个公式,我相信它正在计算摘要统计信息

dfsummary <- df %>%
   group_by(ID, trial, cue) %>%
   summarise(numRows = length(trial))

但是我需要按照我首先描述的方式排列行,然后将该信息附加到该数据框中的一列中。

感谢您的见解!

1 个答案:

答案 0 :(得分:1)

我们先通过'ID''提示'创建一个序列列,然后再按dcast

library(data.table)
out <- dcast(setDT(df1), ID + Cue ~ rowid(ID, Cue), 
      value.var = c("ID", "Cue", "trial", "time", "accuracy"))[,-(1:2)]

然后order

setcolorder(out, order(as.numeric(sub(".*_", "", names(out)))))

如果需要,更改列名

setnames(out, make.unique(sub("[._].*", "", names(out))))
out
#    ID   Cue trial time accuracy ID.1 Cue.1 trial.1 time.1 accuracy.1 ID.2 Cue.2 trial.2 time.2 accuracy.2
#1:  A apple  copy 1450        1    A apple   test1   2121          0    A apple   final   1231          0
#2:  A   dog  copy 2154        1    A   dog   test2      0          1    A   dog   final   5411          1

数据

df1 <- structure(list(ID = c("A", "A", "A", "A", "A", "A"), Cue = c("apple", 
"dog", "apple", "dog", "apple", "dog"), trial = c("copy", "copy", 
"test1", "test2", "final", "final"), time = c(1450L, 2154L, 2121L, 
0L, 1231L, 5411L), accuracy = c(1L, 1L, 0L, 1L, 0L, 1L)), 
class = "data.frame", row.names = c(NA, -6L))