【问题标题】:Combine selected values across columns into one column将跨列的选定值合并为一列
【发布时间】:2020-05-05 20:02:06
【问题描述】:

我有一个数据框 df,其中:

 a  b  c  d
 4  K  12 6
 6  L  K  P
 7  3  P  1
 0  L  90 K
 1  P  4  5
 0  K  17 23

如何将 bcd 两列合并到一个名为 x 的新列中,这样它只保留字母 KLP 到看起来像这样:

 a  x  
 4  K  
 6  L, K, P
 7  P
 0  L, K 
 1  P
 0  K

【问题讨论】:

    标签: r dataframe multiple-columns


    【解决方案1】:

    我们可以使用uniteseparate_rowsunite 列 'b'、'c'、'd' 到单个列 'x',然后使用 separate_rows 在默认分隔符 (_) 处拆分列,同时使用 @987654326 创建唯一的行 ID @,然后是 filter 我们有 'K'、'L'、'P' 元素的行,按 'rn' 分组,summarise by pasteing 'x' 中的 unique 元素

    library(dplyr)
    library(tidyr)
    df %>%
       unite(x, b, c, d) %>%
       mutate(rn = row_number()) %>%
       separate_rows(x) %>%
       filter(x %in% c("K", "L", "P")) %>%
       group_by(rn) %>%
       summarise(a = first(a), x = toString(unique(x))) %>%
       select(-rn)
    # A tibble: 6 x 2
    #      a x      
    #  <int> <chr>  
    #1     4 K      
    #2     6 L, K, P
    #3     7 P      
    #4     0 L, K   
    #5     1 P      
    #6     0 K     
    

    或者另一个选项是pivot_longer

    df %>% 
       mutate(rn = row_number()) %>% 
       pivot_longer(cols = b:d, values_to = 'x') %>% 
       filter( x %in% c("K", "L", "P")) %>% 
       group_by(rn) %>% 
       summarise(a = first(a), x = toString(unique(x))) %>%
       select(-rn)
    

    数据

    df <- structure(list(a = c(4L, 6L, 7L, 0L, 1L, 0L), b = c("K", "L", 
    "3", "L", "P", "K"), c = c("12", "K", "P", "90", "4", "17"), 
        d = c("6", "P", "1", "K", "5", "23")), class = "data.frame", 
        row.names = c(NA, 
    -6L))
    

    【讨论】:

    • 优秀。谢谢!
    【解决方案2】:

    如果您想排除所有数字,另一种解决方案是

    df %>% 
      mutate(x = purrr::pmap_chr(list(b,c,d),
                                 ~ paste0(c(..1, ..2, ..3) %>% 
                                            .[!grepl("^[0-9]{1,}$", .)], 
                                          collapse = ", ")))
    

    或者如果你只想保留 K、L 和 P

    df %>% 
      mutate(x = purrr::pmap_chr(list(b,c,d),
                                 ~ paste0(c(..1, ..2, ..3) %>% 
                                            .[. %in% c("K","L","P")], 
                                          collapse = ", ")))
    

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 2018-07-09
      相关资源
      最近更新 更多