从没有id.var的长到宽的形式?

时间:2015-05-23 20:59:14

标签: r reshape2 melt

我有一些长形式的数据,如下所示:

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。现在,对于这种事情来说显然是多余的,那么如何在不必采取某种循环的情况下做我想做的事情呢?

3 个答案:

答案 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