我不知道如何在不使用for循环的情况下实现这个:
x <- c('a', 'b', 'c', 'd')
> x
[1] "a" "b" "c" "d"
data <- data.frame(
x=c('a', 'b', 'a', 'b', 'c', 'a', 'a', 'b', 'c', 'd'),
name=c('one','one', 'two','two','two', 'three', 'four','four','four','four'),
other=c(1, 4, 5, 3, 2, 4, 5, 6, 3, 2)
)
> data
x name other
1 a one 1
2 b one 4
3 a two 5
4 b two 3
5 c two 2
6 a three 4
7 a four 5
8 b four 6
9 c four 3
10 d four 2
我希望能按照
name
的值将data
拆分成子组,并将每个子组中的x
进行merge
,以填充“缺失行”,得到如下结果:> data
x name other
1 a one 1
2 b one 4
c one 0 <- missing row added
d one 0 <- missing row added
3 a two 5
4 b two 3
5 c two 2
d two 0 <- missing row added
6 a three 4
b three 0 <- missing row added
c three 0 <- missing row added
d three 0 <- missing row added
7 a four 5
8 b four 6
9 c four 3
10 d four 2
最后,将
data.frame
格式重构为如下形式:> data
x one two three four
1 a 1 5 4 5
2 b 4 3 0 6
3 c 0 2 0 3
4 d 0 0 0 2
我可以使用for循环实现它,但我相信一定有更好的方法,比如使用*apply、by、split或类似的东西。有什么建议吗?
**更新**
最终我使用了被接受答案的一点修改(再次感谢,小伙子!),因为我不喜欢使用levels,也不在乎列的顺序。
grid <- expand.grid(x, unique(data$name))
colnames(grid) <- c("x", "name")
data <- merge(grid, data, all.x = TRUE)
data[is.na(data)] <- 0
dcast(data, x ~ name, value.var = 'other')
xtabs
函数;第一部分可以使用xtabs(other ~ x + name, data)
,然后再使用as.data.frame(xtabs(other ~ x + name, data))
。 - alexis_lazxtabs
是怎么工作的。非常感谢你,伙计! - thelawnmowerman