【问题标题】:R - All pairwise combinations of column strings concatenated by the rowR - 由行连接的列字符串的所有成对组合
【发布时间】:2020-06-07 21:33:24
【问题描述】:

如何转换像这样的数据帧:

  X__1  X__2  X__3 
  <chr> <chr> <chr>
1 a     b     c    
2 d     e     f    
3 g     h     i    
4 j     k     l  

进入这个:

  X__1  X__2  X__3 
  <chr> <chr> <chr>
1 a-d   b-e   c-f  
2 a-g   b-h   c-i  
3 a-j   b-k   c-l  
4 d-g   e-h   f-i  
5 d-j   e-k   f-l  
6 g-j   h-k   i-l 

换句话说,它应该对数据框中的整行进行所有可能的成对组合,组合来自同一列但用符号 (-) 分隔的字符串。不需要按照提到字母的其他顺序重复已经完成的组合,即需要“a-d, b-e, c-f”而不是“d-a, e-b, f-c”。

提前谢谢你。如果需要,请告诉我如何改进提出问题。

【问题讨论】:

    标签: r combinations rows


    【解决方案1】:

    我们可以使用map

    library(purrr)
    library(stringr)
    map_dfc(df1, combn, m = 2, FUN = str_c, collapse="-")
    # A tibble: 6 x 3
    #  X__1  X__2  X__3 
    #  <chr> <chr> <chr>
    #1 a-d   b-e   c-f  
    #2 a-g   b-h   c-i  
    #3 a-j   b-k   c-l  
    #4 d-g   e-h   f-i  
    #5 d-j   e-k   f-l  
    #6 g-j   h-k   i-l  
    

    或使用summarise/unnest

    library(dplyr)
    library(tidyr)
    df1 %>%
        summarise(across(everything(), ~ 
            list(combn(., 2, FUN = str_c, collapse="-")))) %>%
        unnest(everything())
    # A tibble: 6 x 3
    #  X__1  X__2  X__3 
    #  <chr> <chr> <chr>
    #1 a-d   b-e   c-f  
    #2 a-g   b-h   c-i  
    #3 a-j   b-k   c-l  
    #4 d-g   e-h   f-i  
    #5 d-j   e-k   f-l  
    #6 g-j   h-k   i-l  
    

    或者base R

    data.frame(lapply(df1, combn, m = 2, paste, collapse="-"))
    #   X__1 X__2 X__3
    #1  a-d  b-e  c-f
    #2  a-g  b-h  c-i
    #3  a-j  b-k  c-l
    #4  d-g  e-h  f-i
    #5  d-j  e-k  f-l
    #6  g-j  h-k  i-l
    

    数据

    df1 <- structure(list(X__1 = c("a", "d", "g", "j"), X__2 = c("b", "e", 
    "h", "k"), X__3 = c("c", "f", "i", "l")), class = "data.frame", row.names = c("1", 
    "2", "3", "4"))
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 2020-01-17
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      相关资源
      最近更新 更多