R 如果列的值出现在另一列中,则对行进行分组

R 如果列的值出现在另一列中,则对行进行分组,r,dplyr,data.table,R,Dplyr,Data.table,我有一个数据帧,我想根据列中的值对其进行分组 诀窍在于,如果值已经出现在我分组所依据的列中,则需要合并一些行 例如: df <- data.frame(col1 = c("R1", "R2", "R2", "R2", "R2", "R4", "R5", "R5", "R5"), col2 = c("R10", "R4", "R5", "R6", "R7", "R5", "R6", "R7", "R9"), stringsAsFactors = FALSE)

我有一个数据帧,我想根据列中的值对其进行分组

诀窍在于,如果值已经出现在我分组所依据的列中,则需要合并一些行

例如:

df <- data.frame(col1 = c("R1", "R2", "R2", "R2", "R2", "R4", "R5", "R5", "R5"),
                 col2 = c("R10", "R4", "R5", "R6", "R7", "R5", "R6", "R7", "R9"), stringsAsFactors = FALSE)

df2 <- aggregate(col2 ~ col1, df, FUN = function(x) paste(unique(x), collapse = ", "))

> df
  col1 col2
1   R1  R10
2   R2   R4
3   R2   R5
4   R2   R6
5   R2   R7
6   R4   R5
7   R5   R6
8   R5   R7
9   R5   R9

> df2
  col1           col2
1   R1            R10
2   R2 R4, R5, R6, R7
3   R4             R5
4   R5     R6, R7, R9
或者最好:

1 col1 col2
2   R1  R10
3   R2   R4
4   R2   R5
5   R2   R6
6   R2   R7
7   R2   R9
一种选择是替换基于相交元素的值,然后进行聚合


可以选择一个带基本R的选项

inds <- df$col1 %in% df$col2
df$col1[inds] <- df$col1[match(df$col1[inds], df$col2)]
或者如果需要逗号分隔的字符串

aggregate(col2 ~ col1, unique(df), toString)

#  col1               col2
#1   R1                R10
#2   R2 R4, R5, R6, R7, R9

对于最初分配给R5的R9,需要分组到R2。为什么?怎么做?因为R5包含在R2中。如果你看df2,col2 R5映射到R2。看看IGRAPHE包——如果你能灵活处理输出,这本质上是一个集群问题。例如:图书馆图;g相关:哇,igraph软件包很棒。谢谢谢谢你。在实际的数据集中,我有更多的行和更多的组要定义,所以如果可能的话,我不喜欢硬编码R2。有没有办法替换这一行?谢谢,这在这个例子中是有效的-在我得到的实际数据集中,这仍然会生成一些重叠的组,但我认为我可以从这里开始工作。
library(dplyr)
library(stringr)
df %>% 
    group_by(col1 = case_when(col1 %in%  intersect(col1, col2) ~ "R2", 
                   TRUE ~ col1)) %>% 
    distinct %>% 
    summarise(col2 = toString(col2))
# A tibble: 2 x 2
#  col1  col2              
#  <chr> <chr>             
#1 R1    R10               
#2 R2    R4, R5, R6, R7, R9
inds <- df$col1 %in% df$col2
df$col1[inds] <- df$col1[match(df$col1[inds], df$col2)]
unique(df)

#  col1 col2
#1   R1  R10
#2   R2   R4
#3   R2   R5
#4   R2   R6
#5   R2   R7
#9   R2   R9
aggregate(col2 ~ col1, unique(df), toString)

#  col1               col2
#1   R1                R10
#2   R2 R4, R5, R6, R7, R9