【问题标题】:Find common third on large data set在大型数据集上找到共同的第三个
【发布时间】:2018-05-13 10:23:10
【问题描述】:

我有一个像

这样的大型数据框
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 中执行此操作

【问题讨论】:

    标签: r large-data


    【解决方案1】:

    这是使用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
    

    【讨论】:

    • 它适用于正常大小的数据集,但是当我尝试设置 mydf 邻接矩阵(g 的大小几乎为 1gb)时,我的实际数据遇到了内存问题。
    • 我试过了,但我猜矩阵太大了。也在处理稀疏矩阵,但无法弄清楚。我会再试一些,然后接受你的回答,因为它解决了一般问题。
    • 第二版@d.b 没有崩溃,但仍在运行。我会告诉你进展如何
    • 运行了三天@d.b 所以我不得不停止它。可能必须以某种方式拆分它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2019-04-10
    • 2013-05-24
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多