【问题标题】:Change Rows to Columns and Group By将行更改为列和分组依据
【发布时间】:2019-06-03 14:29:59
【问题描述】:

我有一个相对较大的 DF,现在需要一种方法来使列变成行。

我的 DF 看起来像这样:

AID FNAME FVALUE
1   A     10
1   B     12
1   C     16
2   A     10
2   E     4
3   F     10
3   G     13

等等。并非所有行都具有所有特征。所以我喜欢这样的最终输出:

AID A B C D E F G H 
1   10 12 16 NULL NULL NULL NULL
2   10 NULL NULL NULL 4 NULL NULL NULL
3   NULL NULL NULL NULL NULL 10 13 NULL

我已经尝试过传播:

wide_DF <- unite_DF %>% spread(FNAME, FVALUE)

但我得到了错误:

错误:每行输出必须由唯一的键组合标识。

我还尝试将数据分组并插入一个新的唯一列:

unite_DF  %>% group_by(AID) %>% mutate(ind = row_number()) %>% spread(FNAME, FVALUE) %>% select(Name, Value)

但是在这里我也遇到了同样的错误。我该怎么做?

【问题讨论】:

    标签: r dataframe spread


    【解决方案1】:

    您似乎在寻找reshape

    AID <- c(1, 1, 1, 2, 2, 3, 3)
    FNAME <- c("A", "B", "C", "A", "E", "F", "G")
    FVALUE <- c(10, 12, 16, 10, 4, 10, 13)
    
    df <- data.frame(AID, FNAME, FVALUE)
    
    df_wide <- reshape(df, direction = "wide", idvar = "AID", v.names = "FVALUE", timevar = "FNAME")
    

    【讨论】:

      【解决方案2】:

      我们可以在将“FNAME”转换为factor 并指定levels 并在spread 中使用spread 后使用drop = FALSE 以避免删除没有组合的列

      library(tidyverse)
      unite_DF %>% 
        mutate(FNAME = factor(FNAME, levels = LETTERS[1:8])) %>% 
        spread(FNAME, FVALUE, drop = FALSE)
      #   AID  A  B  C  D  E  F  G  H
      #1   1 10 12 16 NA NA NA NA NA
      #2   2 10 NA NA NA  4 NA NA NA
      #3   3 NA NA NA NA NA 10 13 NA
      

      数据

      unite_DF <- structure(list(AID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L), FNAME = c("A", 
      "B", "C", "A", "E", "F", "G"), FVALUE = c(10L, 12L, 16L, 10L, 
      4L, 10L, 13L)), class = "data.frame", row.names = c(NA, -7L))
      

      【讨论】:

      • 当我使用它时,我收到错误:rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) 中的错误:无效的时间'值
      • @Tim1234 我展示了与输出一起使用的数据。我这边没有错误
      • 是的,你的权利。我认为问题仍然是R和R的最大向量长度2^31-1。我的总 DF 太大了。
      • @Tim1234 这不起作用,那么基于reshapebase R 也不起作用
      • 是的。谢啦。我投票支持您的答案,因为使用示例 df 它可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      相关资源
      最近更新 更多