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