使用R计算一个文件在另一个文件中元素的频率

时间:2019-06-12 09:34:26

标签: r csv

我有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

2 个答案:

答案 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的新列中对colIDsrowIDsunite列进行排序,该列随后用作与之合并的键new_col。在df2中,我们首先使用df2separate_rows group_by将逗号分隔的条目分成不同的行,并创建一对Pcol值组合的列表。使用Mcol将它们分为两个不同的列,即separate的组合,然后再次使用countpmin对它们进行排序,最后将它们与pmax合并。