在R中扩展数据-允许每个单元格有多个值

在R中扩展数据-允许每个单元格有多个值,r,R,用这些数据 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 其中: time l r 1 1 NA 1 2 2 NA 2 3 3 NA 1 4 4 2

用这些数据

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
其中:

  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
是否有一种有效的方法来强制这种行为或替代方案。输出将是例如

  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/restrape2是dcast。它的语法比spread更复杂,但更灵活。为了完成您的任务,我们可以使用下面的块

我们使用该公式以val列中的值进行时间填充并“排列”,提供NA的填充值,并指定当需要按时间值进行聚合时,我们希望将元素列在一起

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
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