Найти комбинацию определенного элемента с другим элементом столбца - PullRequest
0 голосов
/ 28 июня 2019

Мой файл такой-

   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 ]

2 голосов
/ 28 июня 2019

Можно было бы разделить Mcol на separate_rows, сгруппированные по Pcol, получить combn значений и 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
2 голосов
/ 28 июня 2019

В соответствии с вашим подходом мы можем использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...