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

标签 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)

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

R10 将位于 R1 组(第 1 行)

R4、R5、R6 和 R7 将位于 R2 组(第 2 至 5 行) R5 将位于 R4 组(第 6 行)

R6、R7 和 R9 将位于 R5 组(第 7 至 9 行)

但是 R4 和 R5 已经在 R2 中,所以这将保留在 R2 中。 对于原本分配给R5的R9,需要分到R2中。

所以期望的结果是:

> df3
  col1               col2
1   R1                R10
2   R2 R4, 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

最佳答案

一个选项是根据相交元素替换值,然后进行聚合

i1 <- df$col1 %in% df$col2
df$col1[i1] <- df$col1[match(df$col1[inds], df$col2)]
aggregate(col2 ~ col1, unique(df), FUN = toString)
#   col1               col2
#1   R1                R10
#2   R2 R4, R5, R6, R7, R9

或者使用tidyverse

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

关于r - 如果一列的值出现在另一列中,则对行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155989/

相关文章:

r - 是否可以在不给它一个对象的情况下运行一个函数?

r - 如何按顺序逐行更新

R - 添加具有几乎相同名称的列并使用正确的列名称保存

r - dplyr分组依据,将值从上一个分组结转到下一个

R:Quantstrat TxnFees 乘数

r - 如何向用lattice和latticeExtra制作的图添加图例?

r - 如何在创建栅格的 for 循环中添加平均栅格?右

r - 在R中使用dplyr查找每组的最大值

在数据帧的几列上使用过滤功能删除 NA

R/dplyr : Remove all rows in imported csv data frame that have NA entries only