【问题标题】:Reshape2: multiple observations for variableReshape2:变量的多个观察值
【发布时间】:2016-03-24 23:23:56
【问题描述】:

我有以下示例数据:

d <- data.frame(id=c(1,1,1,2,2), time=c(1,1,1,1,1), var=runif(5))
  id time         var
1  1    1 0.373448545
2  1    1 0.007007124
3  1    1 0.840572603
4  2    1 0.684893481
5  2    1 0.822581501

我想使用dcast 将这个data.frame 重塑为wide 格式,以便输出如下:

  id     var.1       var.2     var.3
1  1 0.3734485 0.007007124 0.8405726
2  2 0.6848935 0.822581501        NA

有人有什么想法吗?

【问题讨论】:

    标签: r casting reshape2


    【解决方案1】:

    通过id 创建一个序列列seq,然后使用dcast

    library(reshape2)
    
    set.seed(123)
    d <- data.frame(id=c(1,1,1,2,2), time=c(1,1,1,1,1), var=runif(5))
    
    d2 <- transform(d, seq = ave(id, id, FUN = seq_along))
    dcast(d2, id ~ seq, value.var = "var")
    

    给予:

      id       1       2       3
    1  1 0.28758 0.78831 0.40898
    2  2 0.88302 0.94047     NaN
    

    【讨论】:

    • 有趣 - 此代码在示例数据上运行良好。但是,当我在原始数据上使用此代码时,第一行的输出不是沿变量水平分布(就像我们想要的那样),而是垂直分布,因此它被粘贴在变量 1 的第二行和第三行中。有谁知道为什么是这样吗?转型效果很好。
    【解决方案2】:

    带有spreaddplyr/tidyr 选项将是

    library(dplyr)
    library(tidyr)
    d %>%
      group_by(id) %>%
      mutate(n1= paste0("var.",row_number())) %>% 
      spread(n1, var) %>%
      select(-time)
    #      id     var.1       var.2     var.3
    #    (int)     (dbl)       (dbl)     (dbl)
    #1     1 0.3734485 0.007007124 0.8405726
    #2     2 0.6848935 0.822581501        NA
    

    【讨论】:

      【解决方案3】:

      好的 - 这是一个可行的解决方案。关键是添加一个计数变量。我的解决方案有点复杂——也许你能想出更好的办法。

      library(dplyr)
      library(magrittr)
      library(reshape2)
      
      d <- data.frame(id=c(1,1,1,2,2,3,3,3,3), time=c(1,1,1,1,1,1,1,1,1), var=runif(9))
      
      group_by(d, id) %>%
        summarise(n = n()) %>%
        data.frame() -> count
      
      f <- c()
      for (i in 1:nrow(count)) {
        f <- c(f, 1:count$n[i])
      }
      
      d <- data.frame(d, f)
      
      dcast(d, id ~ f, value.var = "var")
      

      【讨论】:

        猜你喜欢
        • 2013-12-03
        • 2016-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 2020-04-02
        相关资源
        最近更新 更多