从R中的行创建不同长度的列

时间:2013-09-11 20:37:02

标签: r reshape reshape2

这可能有非常简单的答案,但我已经在这方面工作了几个小时,我仍然无法弄清楚。我想做的就是获取一个包含两列(BEFORE表)的数据框并对其进行更改,以便第一列中的每个唯一值都成为每个新列的名称,第二列值将填入其各自列名称之下(AFTER表)。

ID  age
N1   7
N1   8
N2   5
N3   9
N3   4
N3   9

N1   N2   N3
7    5    9
8    NA   4
NA   NA   9

我已经尝试了reshape2包中的melt()cast()函数,但它们似乎没有做我想要的。有什么建议?提前谢谢!

3 个答案:

答案 0 :(得分:2)

您缺少可以使用ave轻松创建的唯一ID。完成后,您可以使用基础R中的reshape()或“reshape2”中的dcast()来获取您要查找的内容:

mydf$ID2 <- ave(as.character(mydf$ID), mydf$ID, FUN = seq_along)
reshape(mydf, direction = "wide", idvar="ID2", timevar="ID")
#   ID2 age.N1 age.N2 age.N3
# 1   1      7      5      9
# 2   2      8     NA      4
# 6   3     NA     NA      9

library(reshape2)
dcast(mydf, ID2 ~ ID, value.var="age")
#   ID2 N1 N2 N3
# 1   1  7  5  9
# 2   2  8 NA  4
# 3   3 NA NA  9

答案 1 :(得分:1)

acast会让你部分到达:

原始数据:

df <- structure(list(ID = structure(c(1L, 1L, 2L, 3L, 3L, 3L), .Label = c("N1", 
    "N2", "N3"), class = "factor"), age = c(7L, 8L, 5L, 9L, 4L, 5L
    )), .Names = c("ID", "age"), class = "data.frame", row.names = c(NA, 
    -6L))
> df
  ID age
1 N1   7
2 N1   8
3 N2   5
4 N3   9
5 N3   4
6 N3   5

df2 <- acast(df, age~ID)

> df2
  N1 N2 N3
4 NA NA  4
5 NA  5  5
7  7 NA NA
8  8 NA NA
9 NA NA  9

答案 2 :(得分:1)

使用here中的cbind.fill,您可以执行以下操作:

do.call(cbind.fill, split(df$age, df$ID))
#     [,1] [,2] [,3]
#[1,]    7    5    9
#[2,]    8   NA    4
#[3,]   NA   NA    5