1

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

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()andcast()函数,但它们似乎没有做我想要的。有什么建议么?先感谢您!

4

3 回答 3

2

您缺少唯一 ID,您可以使用ave. 一旦你有了这些,你可以使用reshape()from base R 或dcast()from "reshape2" 来获得你正在寻找的东西:

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
于 2013-09-12T01:24:39.477 回答
1

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
于 2013-09-11T21:23:46.720 回答
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
于 2013-09-11T20:45:36.693 回答