这可能有非常简单的答案,但我已经在这方面工作了几个小时,我仍然无法弄清楚。我想做的就是获取一个包含两列(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()
函数,但它们似乎没有做我想要的。有什么建议?提前谢谢!
答案 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