在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