我的文件就是这样-
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元素。
答案 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