【问题标题】:From long to wide form without id.var?没有 id.var 从长格式到宽格式?
【发布时间】:2015-08-05 16:57:21
【问题描述】:

我有一些长格式的数据,如下所示:

dat1 = data.frame(
  id = rep(LETTERS[1:2], each=4),
  value = 1:8
)

表格形式:

id   value
A    1
A    2
A    3
A    4
B    5
B    6
B    7
B    8

我希望它是简短的,看起来像这样:

dat1 = data.frame(A = 1:4, B = 5:8)

表格形式:

A  B
1  5
2  6
3  7
4  8

现在我可以通过循环使用cbind() 和其他东西来解决这个问题,但我想使用某种重塑/融化功能,因为我认为这些是做这种事情的最佳方式。

但是,从花费 >30 分钟尝试让 melt()reshape() 工作,阅读 SO 上的答案,似乎这些功能需要设置 id.var。现在,这种事情显然是多余的,那么我该如何做我想做的事而不必诉诸某种循环呢?

【问题讨论】:

    标签: r reshape2 melt


    【解决方案1】:

    我很确定这个问题之前已经回答过了。无论如何,unstack 在这种特殊情况下很方便,组大小相同:

    unstack(dat1, form = value ~ id)
    #   A B
    # 1 1 5
    # 2 2 6
    # 3 3 7
    # 4 4 8
    

    【讨论】:

    • 我找不到它。我发现的所有答案和指南都假设使用 id.var。我只是堆积了没有 id.var 的数据。当然,我可以给他们一个合适的 id.var 例如rownames(dat1) = rep(1:4,2),但这违背了自动执行的目的。
    【解决方案2】:

    当存在不同数量的 As 和 B 时,以下解决方案有效。对于同等数量,unstack 效果很好,而且代码更少(Henrik's 答案)。

    # create more general data (unbalanced 'id')
    each <- c(4,2,3)
    dat1 = data.frame(
        id = unlist(mapply(rep, x = LETTERS[1:length(each)], each = each)),
        value = 1:sum(each),
        row.names = 1:sum(each) # to reproduce original row.names
    )
    
    tab <- table(dat1$id)
    dat1$timevar <- unlist(sapply(tab, seq))
    library(reshape2)
    dcast(dat1, timevar ~ id )[-1]
    

    初始数据:

    id value
    1  A     1
    2  A     2
    3  A     3
    4  A     4
    5  B     5
    6  B     6
    7  C     7
    8  C     8
    9  C     9
    

    结果:

      A  B  C
    1 1  5  7
    2 2  6  8
    3 3 NA  9
    4 4 NA NA
    

    【讨论】:

      【解决方案3】:

      这是一个需要考虑的基本 R 方法。它使用lengths 函数,我相信它是在 R 3.2 中引入的。

      x <- split(dat1$value, dat1$id)
      as.data.frame(lapply(x, function(y) `length<-`(y, max(lengths(x)))))
      #   A  B  C
      # 1 1  5  7
      # 2 2  6  8
      # 3 3 NA  9
      # 4 4 NA NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 2021-05-12
        相关资源
        最近更新 更多