在R中传播数据 - 允许每个单元有多个值

时间:2018-01-24 16:52:55

标签: 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

1 个答案:

答案 0 :(得分:1)

data.table的{​​{1}} / reshape2等效tidyr::spreaddcast。它的语法比spread更复杂,但它更灵活。为了完成你的任务,我们可以使用下面的块。

我们使用公式“side time {填充val列中的值),提供fill NAlist },并指定我们希望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)}