使用这些数据
d <- data.frame(time=1:5, side=c("r","r","r","l","l"), val = c(1,2,1,2,1))
d
time side val
1 1 r 1
2 2 r 2
3 3 r 1
4 4 l 2
5 5 l 1
我们可以传播到这样一个整洁的数据框:
library(tidyverse)
d %>% spread(side,val)
给出了:
time l r
1 1 NA 1
2 2 NA 2
3 3 NA 1
4 4 2 NA
5 5 1 NA
但是说我们在给定的时间/方面有多个val
。例如:
d <- data.frame(time=c(1:5,5), side=c("r","r","r","l","l","l"), val = c(1,2,1,2,1,2))
time side val
1 1 r 1
2 2 r 2
3 3 r 1
4 4 l 2
5 5 l 1
6 5 l 2
现在由于价值重复,这项工作不会起作用:
d %>% spread(side,val)
Error: Duplicate identifiers for rows (5, 6)
是否存在强制此行为(或替代方法)的有效方法。输出将是例如。
time l r
1 1 NA 1
2 2 NA 2
3 3 NA 1
4 4 2 NA
5 5 1, 2 NA
答案 0 :(得分:1)
data.table
的{{1}} / reshape2
等效tidyr::spread
为dcast
。它的语法比spread
更复杂,但它更灵活。为了完成你的任务,我们可以使用下面的块。
我们使用公式“side
time
{填充val
列中的值),提供fill
NA
值list
},并指定我们希望time
个元素在每个library(data.table)
d <- data.table(time=c(1:5,5),
side=c("r","r","r","l","l","l"),
val = c(1,2,1,2,1,2))
data.table::dcast(d, time ~ side,
value.var='val',
fill=NA,
fun.aggregate=list)
#OUTPUT
# time l r
# 1: 1 NA 1
# 2: 2 NA 2
# 3: 3 NA 1
# 4: 4 2 NA
# 5: 5 1,2 NA
值需要聚合时。
${__javaScript("${Counter}" > 9 && "${Counter}" < 16)}