我有2个文件
文件1-
colIDs rowIDs
M1 M2
M1 M3
M3 M1
M3 M2
M4 M5
M7 M6
文件2-
Pcol Mcol
P1 M1,M2,M5,M6
P2 M1,M2,M3,M5
P3 M4,M5,M7,M6
我要count the frequency
对文件2 Mcol中的文件1的第1列和第2列进行配对。
预期输出-
colIDs rowIDs freq
M1 M2 2
M1 M3 1
M3 M1 1
M3 M2 1
M4 M5 1
M7 M6 1
答案 0 :(得分:1)
获取“ Mcol”每一行的所有组合,然后进行行绑定和聚合:
# example data
x <- read.table(text = "Pcol Mcol
P1 M1,M2,M5,M6
P2 M1,M2,M3,M5
P3 M4,M5,M7,M6", header = TRUE, stringsAsFactors = FALSE)
# split on ",", get all unique combinations
xx <- do.call(rbind.data.frame,
lapply(x$Mcol, function(i){
n <- sort(unlist(strsplit(i, ",")))
t(combn(n, 2))
}))
# get count of all pairs
data.frame(table(paste(xx[, 1], xx[, 2], sep = ",")))
# Var1 Freq
# 1 M1,M2 2
# 2 M1,M3 1
# 3 M1,M5 2
# 4 M1,M6 1
# 5 M2,M3 1
# 6 M2,M5 2
# 7 M2,M6 1
# 8 M3,M5 1
# 9 M4,M5 1
# 10 M4,M6 1
# 11 M4,M7 1
# 12 M5,M6 2
# 13 M5,M7 1
# 14 M6,M7 1
答案 1 :(得分:0)
这是一个非常大的storyboard
链,因此我可能要执行某些复杂的步骤,但可以达到预期的效果。
dplyr
对于library(dplyr)
library(tidyr)
df1 %>%
mutate(c1 = pmin(colIDs, rowIDs),
c2 = pmax(colIDs, rowIDs)) %>%
unite(newcol, c1, c2) %>%
left_join(df2 %>%
separate_rows(Mcol) %>%
group_by(Pcol) %>%
summarise(new_col = list(combn(Mcol, 2, paste0, collapse = ","))) %>%
unnest() %>%
separate(new_col, c("col1", "col2")) %>%
count(col1, col2) %>%
mutate(colIDs = pmin(col1, col2), rowIDs = pmax(col1, col2)) %>%
unite(newcol, colIDs, rowIDs) %>%
select(newcol, n), by = c("newcol" = "newcol")) %>%
select(-newcol)
# colIDs rowIDs n
#1 M1 M2 2
#2 M1 M3 1
#3 M3 M1 1
#4 M3 M2 1
#5 M4 M5 1
#6 M7 M6 1
,我们在名为df1
的新列中对colIDs
和rowIDs
和unite
列进行排序,该列随后用作与之合并的键new_col
。在df2
中,我们首先使用df2
,separate_rows
group_by
将逗号分隔的条目分成不同的行,并创建一对Pcol
值组合的列表。使用Mcol
将它们分为两个不同的列,即separate
的组合,然后再次使用count
和pmin
对它们进行排序,最后将它们与pmax
合并。