【问题标题】:How to spread or cast a single column to several - Error: Duplicate identifiers for rows [duplicate]如何将单个列传播或转换为多个-错误:行的标识符重复[重复]
【发布时间】:2018-05-28 01:21:22
【问题描述】:

我有以下 df 并想传播/投射。

df <- data.frame(experiment=c("ex3", "ex1", "ex1", "ex2","ex7", "ex7"),
                 mod=c("mod1", "mod1","mod7", "mod8","mod3", "mod9"))

df

  experiment  mod
1        ex3 mod1
2        ex1 mod1
3        ex1 mod7
4        ex2 mod8
5        ex7 mod3
6        ex7 mod9

想要的输出

  experiment mod_A mod_B
1        ex1  mod1  mod7
2        ex2  mod8  <NA>
3        ex3  mod1  <NA>
4        ex7  mod3  mod9

我尝试过 tidyr::spread 但出现错误

df %>%  spread(experiment, mod)

Error: Duplicate identifiers for rows (2, 3), (5, 6)

任何帮助将不胜感激。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    我们可以为每个 experiment 组创建一个 ID 列来解决这个问题。

    library(dplyr)
    library(tidyr)
    
    df2 <- df %>%
      arrange(experiment, mod) %>%
      group_by(experiment) %>%
      mutate(ID = 1:n()) %>%
      spread(ID, mod) %>%
      ungroup()
    df2
    # # A tibble: 4 x 3
    #   experiment `1`   `2`  
    #   <fct>      <fct> <fct>
    # 1 ex1        mod1  mod7 
    # 2 ex2        mod8  NA   
    # 3 ex3        mod1  NA   
    # 4 ex7        mod3  mod9
    

    【讨论】:

      【解决方案2】:

      使用dplyr(0.7.5 版)和tidyr(0.8.1 版),您可以简单地使用summariseseparate

      df %>%
        group_by(experiment) %>%
        summarise(mod = paste(mod, collapse = ",")) %>%
        separate(mod, into = c("mod_A", "mod_B"))
      
      # A tibble: 4 x 3
      #   experiment mod_A mod_B
      #   <chr>      <chr> <chr>
      # 1 ex1        mod1  mod7 
      # 2 ex2        mod8  NA   
      # 3 ex3        mod1  NA   
      # 4 ex7        mod3  mod9 
      

      【讨论】:

        猜你喜欢
        • 2019-06-01
        • 2016-09-22
        • 2018-07-01
        • 2018-02-04
        • 2018-04-03
        • 2016-11-04
        • 1970-01-01
        • 2019-10-22
        • 2018-04-19
        相关资源
        最近更新 更多