我有以下格式的数据:
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))
但是我需要按照我首先描述的方式排列行,然后将该信息附加到该数据框中的一列中。
感谢您的见解!
答案 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))