将数据分组为小块(大数据问题)
Group data into small chunk (big data issue)
我一直在寻找在 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 loops
来解决
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 行。两个循环可能会永远花费 运行。
您想要做的(如果我理解正确的话)是在图中找到聚类。您可以将 a
和 b
列视为图中的节点,每行表示节点之间的 link。 a
列中的节点与 b
列中的节点不同(如果我错了,请再次纠正我)。
这是我们的策略:
- 加载
igraph
库,让我们构建和分析图表;
- 为
a
和 b
列的每个不同值提供一个数字索引,通过 factor
并考虑到 b
列索引必须不同于a
个;
- 根据上一点获得的
matrix
构建图表;
- 调用
igraph::clusters
函数returns为每个节点所属的集群;
- 最终为原始
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 中将数据分组为小块的答案。假设我有
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 loops
来解决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 行。两个循环可能会永远花费 运行。
您想要做的(如果我理解正确的话)是在图中找到聚类。您可以将 a
和 b
列视为图中的节点,每行表示节点之间的 link。 a
列中的节点与 b
列中的节点不同(如果我错了,请再次纠正我)。
这是我们的策略:
- 加载
igraph
库,让我们构建和分析图表; - 为
a
和b
列的每个不同值提供一个数字索引,通过factor
并考虑到b
列索引必须不同于a
个; - 根据上一点获得的
matrix
构建图表; - 调用
igraph::clusters
函数returns为每个节点所属的集群; - 最终为原始
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