【问题标题】:Group the text if union如果联合,则对文本进行分组
【发布时间】: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 %&gt;% group_by(ITEM) %&gt;% mutate(id = row_number()) %&gt;% spread(id, LOCATION)吗?
  • @TungManLok 我在下面提出了一个解决方案。仍然不完全清楚这些组。例如,您注意到“项目 A 和 B 在“bbb”处有交叉点,项目 B 和 C 在“zzz”处有交叉点。所以 A B C 将是一个组”但在您的 data.frame 输入示例中,项目“C”没有有任何交集,所以不清楚为什么 ABC 是一个群?

标签: r text grouping


【解决方案1】:
#Convert columns to character to avoid complications later
df$ITEM = as.character(df$ITEM)
df$LOCATION = as.character(df$LOCATION)

#Split ITEM by LOCATION and convert each sub-group into data.frame
#by making the first element of each sub-group 'from' and all elements 'to'
df1 = do.call(rbind,
              lapply(split(df$ITEM, df$LOCATION), function(x)
                  data.frame(from = x[1], to = x, stringsAsFactors = FALSE)))

library(igraph)
#Convert the data.frame df1 into graph
g = graph.data.frame(df1)
#Use 'clusters' to identify the separate groups
#and 'groups' to extract the vertices (in this case, ITEM)
groups(clusters(g))
#$`1`
#[1] "A" "C" "B"

#$`2`
#[1] "D" "G" "F"

#$`3`
#[1] "E"

您还可以删除末尾的LOCATION(基于您的问题的comment

lapply(groups(clusters(graph.data.frame(df))), function(x) x[x %in% df$ITEM])
#$`1`
#[1] "A" "B" "C"

#$`2`
#[1] "D" "F" "G"

#$`3`
#[1] "E"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2020-04-18
    • 2014-10-27
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多