r - 将数据分组为小块(大数据问题)

标签 r grouping bigdata

我正在寻找在 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 行。两个循环可能会导致永远运行下去。

最佳答案

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

这是我们的策略:

  • 加载 igraph 库,让我们可以构建和分析图表;
  • 通过 factorab 列的每个不同值提供数字索引,并考虑 b 列索引必须与 a 不同;
  • 根据上一点获得的矩阵构建图表;
  • 调用 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

关于r - 将数据分组为小块(大数据问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30264209/

相关文章:

R - 合并两个表并计算变量之间的转移

r - 将矩阵转换为R中的栅格

matlab - 根据一列对矩阵行进行分组

hadoop - 将多个列族从hbase导入到配置单元

r - 基于 R 中的另一个向量创建一个向量?

c# - 将列表分组为每组 X 项的组

javascript - 使用 underscore.js/js 反转父子关系

mysql - 存储和检索 547.500.000.000 条记录

apache-spark - 如何使用 spark 插入 HDFS?

r - 对象错误[[名称,精确 = TRUE]] : subscript out of bounds