r - 在大数据集上找到共同的第三个

标签 r large-data

我有一个像

df <- data.frame(group= c("a","a","b","b","b","c"),
             person = c("Tom","Jerry","Tom","Anna","Sam","Nic"), stringsAsFactors = FALSE)

df
    group person
1     a    Tom
2     a  Jerry
3     b    Tom
4     b   Anna
5     b    Sam
6     c    Nic

并希望得到结果
df.output
  pers1 pers2 person_in_common
1  Anna Jerry              Tom
2 Jerry   Sam              Tom
3   Sam   Tom             Anna
4  Anna   Tom              Sam
6  Anna   Sam              Tom

结果数据框基本上给出了一个表格,其中包含所有与另一个人有共同点的人。我找到了一种在 SQL 中执行此操作的方法,但它需要很长时间,所以我想知道是否有一种在 R 中执行此操作的有效方法

最佳答案

这是一个使用 igraph包裹。基本思想是创建一个图,然后为每个节点提取两个相邻的节点。

library(igraph)
X1 = split(df$person, df$group)
X2 = X1[lengths(X1) >= 2]
dat = data.frame(do.call(rbind, unlist(lapply(X2, function(x)
            combn(x, 2, sort, FALSE)), recursive = FALSE)))
g = graph.data.frame(dat, directed = FALSE)
mydf = data.frame(as.matrix(get.adjacency(g)))
mydf = mydf[colSums(mydf) > 1]
ANS = sapply(mydf, function(x) t(combn(row.names(mydf)[which(x == 1)], 2)))
do.call(rbind, lapply(names(ANS), function(nm) data.frame(ANS[[nm]], nm)))
#     X1   X2   nm
#1   Sam  Tom Anna
#2  Anna  Tom  Sam
#3 Jerry Anna  Tom
#4 Jerry  Sam  Tom
#5  Anna  Sam  Tom

或者
mynames = unique(do.call(c, X2))
do.call(rbind,
        lapply(mynames, function(x){
            L = V(g)$name[unlist(adjacent_vertices(graph = g, v = x))]
            if(length(L) >= 2){
                setNames(data.frame(t(combn(L, 2)), x), c("P1", "P2", "P3"))
            }else{
                setNames(data.frame(NA, NA, x), c("P1", "P2", "P3"))
            }
        }))
#     P1   P2    P3
#1 Jerry Anna   Tom
#2 Jerry  Sam   Tom
#3  Anna  Sam   Tom
#4  <NA> <NA> Jerry
#5   Sam  Tom  Anna
#6  Anna  Tom   Sam

关于r - 在大数据集上找到共同的第三个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47557369/

相关文章:

Python 内存不足(使用后缀树)

r - 如何使 Fluent UI Nav 水平折叠

r - 在 Knitr 中为 md 或 HTML 输出设置页面宽度

java - 以人类可读的格式将巨大的 ArrayList 写入文件

php - mysql select查询无法无限制地执行

python - 将大型 csv 转换为稀疏矩阵以在 sklearn 中使用

当我添加 create_dir : true 时,R 包中的 rmarkdown 模板失败

r - 按时间顺序排列带时间戳的数据

r - 如何使用函数在data.table/R 中进行递归计算?

无论设置是否正确,大文件上传时 PHP 连接都会重置