【发布时间】:2019-03-26 03:27:42
【问题描述】:
这是我的数据:
ITEM <- c("A","A","A","B","B","B","B","C","C","D","D","E","E","F","G","G","G")
LOCATION <- c("aaa","bbb","ccc","bbb","fff","ggg","zzz","zzz","eee","hhh","iii","kkk","jjj","iii","iii","yyy","xxx")
df <- as.data.frame(cbind(ITEM,LOCATION))
Long Form:
ITEM LOCATION
1 A aaa
2 A bbb
3 A ccc
4 B bbb
5 B fff
6 B ggg
7 B zzz
8 C zzz
9 C eee
10 D hhh
11 D iii
12 E kkk
13 E jjj
14 F iii
15 G iii
16 G yyy
17 G xxx
宽格式(更易于阅读):
ITEM LOCATION.1 LOCATION.2 LOCATION.3 LOCATION.4
A aaa bbb ccc <NA>
B bbb fff ggg zzz
C zzz eee <NA> <NA>
D hhh iii <NA> <NA>
E kkk jjj <NA> <NA>
F iii <NA> <NA> <NA>
G iii yyy xxx <NA>
最初我在位置相交时手动对项目进行分组。
即我将分组为 {A,B,C},{D,F,G},{E}
我的原始数据有 8000 行,这需要我几天时间。 当数据集较小时,我可以使用左连接并获得所需的输出 但是当数据集很大时,我不能使用它。
有没有包可以通过union对元素进行分组?
【问题讨论】:
-
你能解释一下你是如何做交叉口的吗?您想找到“ITEM”与“LOCATION”的交叉点吗?严格来说,大写“A”与小写“a”没有交集。例如,{D,F,G} 来自哪里?还是 {E}?
-
路口只关注“LOCATION”。例如,项目 A 和 B 在“bbb”处有交集,而项目 B 和 C 在“zzz”处有交集。所以 A B C 将是一个组。我发现了一个名为“igraph”的包,但在这种情况下我不知道如何分组。谢谢@Soren
-
@TungManLok - 见
igraph::clusters-clusters(graph.data.frame(df)) -
你需要
library(tidyverse); df %>% group_by(ITEM) %>% mutate(id = row_number()) %>% spread(id, LOCATION)吗? -
@TungManLok 我在下面提出了一个解决方案。仍然不完全清楚这些组。例如,您注意到“项目 A 和 B 在“bbb”处有交叉点,项目 B 和 C 在“zzz”处有交叉点。所以 A B C 将是一个组”但在您的 data.frame 输入示例中,项目“C”没有有任何交集,所以不清楚为什么 ABC 是一个群?