在 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

我们可以像这样扩展到一个整洁的数据帧:

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

我们使用公式按time"扩散"side(填充val列中的值(,提供NAfill值,并指定当每个值需要聚合时,我们要将元素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

相关内容

  • 没有找到相关文章

最新更新