有了这些数据
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
tidyr::spread
的 data.table
/reshape2
等价物是 dcast
。 它的语法比spread
复杂,但更灵活。 为了完成您的任务,我们可以使用以下块。
我们使用公式按time
"扩散"side
(填充val
列中的值(,提供NA
的fill
值,并指定当每个值需要聚合时,我们要将元素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