如何将具有两列的数据帧重新整形为宽格式?

时间:2015-04-02 14:16:22

标签: r

我想重塑以下数据框

x <- structure(
    list(name = c("HT", "AT", "HG", "AG"),
         conv = c(2L, + 2L, 3L, 4L)),
    .Names = c("name", "conv"), row.names = 1:4, class = "data.frame")

> x
  name conv
1   HT    2
2   AT    2
3   HG    3
4   AG    4

  conv  x.1  x.2
1    2   HT   AT
2    3   HG   NA
3    4   AG   NA

在最终数据框中,每个不同的值都应该有一行 conv以及与原始数据中的行一样多的x.?conv特定值的框架,必要时填充NA。我不关心列名。

我尝试了reshape,但我无法让它发挥作用,因为它似乎需要它 我没有的第三栏:

> reshape(x, idvar='conv', direction='wide')
Error in `[.data.frame`(data, , timevar) : undefined columns selected

2 个答案:

答案 0 :(得分:3)

使用data.table v1.9.5

require(data.table)
dcast(setDT(x), conv ~ paste0("x.", x[, seq_len(.N), by=conv]$V1), value.var="name")
#    conv x.1 x.2
# 1:    2  HT  AT
# 2:    3  HG  NA
# 3:    4  AG  NA

您可以按照here说明进行安装。

答案 1 :(得分:2)

你可以试试的东西:

xmax <- max(table(x$conv))
xsplit <- split(x, x$conv)
xsplit <- sapply(xsplit, function(tab){c(tab$name, rep(NA, xmax-length(tab$name)))})
x2 <- data.frame(conv=x$conv[!duplicated(x$conv)], t(xsplit), stringsAsFactors=F)
colnames(x2)[-1]<-paste("x",1:xmax,sep=".")
x2
#  conv x.1  x.2 
#2    2  HT   AT
#3    3  HG <NA>
#4    4  AG <NA>

NB :通过重塑,你可以做下面的事情,但我不认为这是你想要的。可能会设置一些参数,以便您得到您想要的但我真的不是reshape专家: - (

reshape(data=x, v.names="name", timevar="name", idvar="conv", direction="wide")
#  conv name.HT name.AT name.HG name.AG
#1    2      HT      AT    <NA>    <NA>
#3    3    <NA>    <NA>      HG    <NA>
#4    4    <NA>    <NA>    <NA>      AG