查找特定元素与其其他列元素的组合

时间:2019-06-28 05:13:13

标签: r

我的文件就是这样-

   Pcol       Mcol
    P1      M1,M2,M5,M6
    P2      M1,M2,M3,M5
    P3      M4,M5,M7,M6

我要find the combination of Mcol elements along with Pcol

预期输出-

Pcol Mcol        
P1  M1,M2        
P2  M1,M2        
P1  M1,M5        
P2  M1,M5        
P1  M1,M6        
P1  M2,M5        
P2  M2,M5        
P1  M2,M6        
P1  M5,M6        
P3  M5,M6        
P2  M1,M3        
P2  M2,M3        
P3  M4,M5        
P3  M4,M7        
P3  M4,M6        
P3  M7,M6        

我已经尝试过了-

x <- read.csv("file.csv" ,header = TRUE, stringsAsFactors = FALSE)
xx <- do.call(rbind.data.frame, 
              lapply(x$Gcol, function(i){
                n <- sort(unlist(strsplit(i, ",")))
                t(combn(n, 2))
              }))

但是它只给出组合的输出,而不是Pcol元素。

2 个答案:

答案 0 :(得分:2)

与您的方法类似,我们可以使用Map而不是lapply来获取Pcol元素

do.call(rbind, Map(function(x, y) data.frame(Pcol=x, Mcol=combn(y, 2, toString)), 
               df$Pcol, strsplit(df$Mcol, ",")))


#   Pcol   Mcol
#1    P1 M1, M2
#2    P1 M1, M5
#3    P1 M1, M6
#4    P1 M2, M5
#5    P1 M2, M6
#6    P1 M5, M6
#7    P2 M1, M2
#8    P2 M1, M3
#9    P2 M1, M5
#10   P2 M2, M3
#11   P2 M2, M5
#12   P2 M3, M5
#13   P3 M4, M5
#14   P3 M4, M7
#15   P3 M4, M6
#16   P3 M5, M7
#17   P3 M5, M6
#18   P3 M7, M6

或使用tidyverse

library(tidyverse)

df %>%
  mutate(Mcol = list(combn(str_split(Mcol, ",")[[1]], 2, toString))) %>%
  unnest()

答案 1 :(得分:2)

一种选择是将'Mcol'与separate_rows分开,并按'Pcol'分组,获得combn的'values'和unnest

library(tidyverse)
df1 %>% 
   separate_rows(Mcol) %>% 
   group_by(Pcol) %>% 
   summarise(Mcol = list(combn(Mcol, 2, FUN = toString))) %>%
   unnest
# A tibble: 18 x 2
#   Pcol   Mcol
#   <fct> <chr> 
# 1 P1    M1, M2
# 2 P1    M1, M5
# 3 P1    M1, M6
# 4 P1    M2, M5
# 5 P1    M2, M6
# 6 P1    M5, M6
# 7 P2    M1, M2
# 8 P2    M1, M3
# 9 P2    M1, M5
#10 P2    M2, M3
#11 P2    M2, M5
#12 P2    M3, M5
#13 P3    M4, M5
#14 P3    M4, M7
#15 P3    M4, M6
#16 P3    M5, M7
#17 P3    M5, M6
#18 P3    M7, M6