【问题标题】:How to reshape a data frame with two columns to wide format?如何将具有两列的数据框重塑为宽格式?
【发布时间】:2015-04-02 14:16:22
【问题描述】:

我想重塑下面的数据框

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

【问题讨论】:

    标签: r


    【解决方案1】:

    使用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的说明进行安装。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-20
        • 2022-01-11
        相关资源
        最近更新 更多