【问题标题】:Group data into small chunk (big data issue)将数据分组为小块(大数据问题)
【发布时间】:2015-05-16 00:51:24
【问题描述】:

我正在寻找在 R 中将数据分组为小块的答案。假设我有

df = data.frame(a = c(1, 2, 3, 1, 5), b = c(2, 3, 2, 4, 4))

我想要一个新列来指定组 ID。具有相同 a 或 b 值的行将被分组为一组。每个新组的组 ID 都会递增。

样本的最终输出是

Group a b 
1    1  2 
2    2  3 
1    3  2 
1    1  4 
1    5  4

这个问题其实并不新鲜。我可以用 for 循环解决它

i.range = nrow(a) - 1
j.range = nrow(a)
k = 2
df$group_id = 1

for(i in 1:i.range){
  for(j in 2:j.range){
    #if not a new group
    if (df[j,"a"] == df[i, "a"] | 
          df[j, "b"] == df[i, "b"]) df[j, "group_id"] = df[i, "group_id"]
    else{
      df[j, "group_id"] = k
      k = k+1
    }  
  }
}

问题是我的数据框有超过 40k 行。两个循环可能会永远运行它。

【问题讨论】:

    标签: r grouping bigdata


    【解决方案1】:

    您想要做的(如果我理解正确的话)是在图中找到集群。您可以将 ab 列视为图中的节点,并且每一行表示节点之间的链接。 a 列中的节点与b 列中的节点不同(再次,如果我错了,请纠正我)。

    这是我们的策略:

    • 加载 igraph 库,让我们构建和分析图表;
    • ab 列的每个不同值提供一个数字索引,通过factor 并考虑到b 列索引必须不同于a 的索引;
    • 从上一点得到的matrix构建图;
    • 调用igraph::clusters函数,为每个节点返回它所属的集群;
    • 最终为原始data.frame 的每一行指明相关簇。

    我们在这里:

    require(igraph)
    #make a copy of the original df, just in case you want to preserve it
    df2<-df
    #getting indices for each "node"
    df[]<-lapply(df,function(x) as.numeric(factor(x)))
    #getting different indices for the b column
    df$b<-df$b + max(df$a)
    #building the graph
    mygraph<-graph.edgelist(as.matrix(df))
    #obtaining the clusters
    clus<-clusters(mygraph)
    #and finally..
    df2$group<-clus$membership[df$a]
    #  a b group
    #1 1 2     1
    #2 2 3     2
    #3 3 2     1
    #4 1 4     1
    #5 5 4     1
    

    【讨论】:

    • 嗨 Nicola,它对我的​​问题不起作用。也许,在我的真实数据中,a 和 b 的值是字符。我在组列的最后发现了很多 NA 值。
    • 我在这里添加我的文件以防有人想观察link
    • 我刚刚尝试了df&lt;-read.csv("test.csv") 并按照我的路线行事。没有收到错误,数据中也没有NAs。一切似乎都正常。
    • 尼古拉。似乎使用只有 2 列的数据。我首先删除了其他列并使用了您的方法,并且找不到更多的 NA。我将随机检查列表并尽快回复您。非常感谢
    • 死心塌地,尼古拉。我将您的答案标记为正确。非常感谢
    猜你喜欢
    • 2021-03-28
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多