我有一些长形式的数据,如下所示:
dat1 = data.frame(
id = rep(LETTERS[1:2], each=4),
value = 1:8
)
以表格形式:
id value
A 1
A 2
A 3
A 4
B 5
B 6
B 7
B 8
我希望它是简短的形式,看起来像这样:
dat1 = data.frame(A = 1:4, B = 5:8)
以表格形式:
A B
1 5
2 6
3 7
4 8
现在我可以通过使用cbind()
循环来解决这个问题,但是我想使用某种重塑/融合函数,因为这些是我认为这样做的最好方法。
但是,从花费> 30分钟尝试让melt()
和reshape()
工作,阅读SO上的答案,似乎这些功能需要设置id.var
。现在,对于这种事情来说显然是多余的,那么如何在不必采取某种循环的情况下做我想做的事情呢?
答案 0 :(得分:3)
我很确定之前已经回答了这个问题。无论如何,unstack
在这种具有相同组大小的特殊情况下很方便:
unstack(dat1, form = value ~ id)
# A B
# 1 1 5
# 2 2 6
# 3 3 7
# 4 4 8
答案 1 :(得分:2)
当有不同数量的As和B时,下面的解决方案有效。对于相同的计数,unstack
效果很好,代码较少(Henrik's回答)。
# create more general data (unbalanced 'id')
each <- c(4,2,3)
dat1 = data.frame(
id = unlist(mapply(rep, x = LETTERS[1:length(each)], each = each)),
value = 1:sum(each),
row.names = 1:sum(each) # to reproduce original row.names
)
tab <- table(dat1$id)
dat1$timevar <- unlist(sapply(tab, seq))
library(reshape2)
dcast(dat1, timevar ~ id )[-1]
初始数据:
id value
1 A 1
2 A 2
3 A 3
4 A 4
5 B 5
6 B 6
7 C 7
8 C 8
9 C 9
结果:
A B C
1 1 5 7
2 2 6 8
3 3 NA 9
4 4 NA NA
答案 2 :(得分:2)
这是一个需要考虑的基本R方法。它使用lengths
函数,我相信它是在R 3.2中引入的。
x <- split(dat1$value, dat1$id)
as.data.frame(lapply(x, function(y) `length<-`(y, max(lengths(x)))))
# A B C
# 1 1 5 7
# 2 2 6 8
# 3 3 NA 9
# 4 4 NA NA