连接数据帧中的行并基于它删除行



我有一个数据框,内容如下:

Column_A | Column_B | Column_C  
---------|----------|---------  
1        |  A       | ABCD  
1        | B        | ABCD  
1        | C        | ABCD  
1        | D        | ABCD  
2        | B        | BCDX  
2        | C        | BCDX  
2        | D        | BCDX  
2        | X        | BCDX  
3        | A        | ABCD  
3        | B        | ABCD  
3        | C        | ABCD  
3        | D        | ABCD  

然后,我想找出column_C分组的独特之处。此步骤的输出如下所示:

Column_A | Column_B  
-------- | --------  
ABCD     | 2  
BCDX     | 1  

此表显示了对于串联 ABCD,我们在顶部表的 A 列中有两个唯一值

下一步是在 D 列中为 ABCD 的所有子字符串成员分配 ABCD

Column_A | Column_B | Column_C  
---------|----------|---------  
1        | A        | ABCD  
1        | B        | ABCD  
1        | C        | ABCD  
1        | D        | ABCD  
2        | B        | ABCD  
2        | C        | ABCD  
2        | D        | ABCD  
2        | X        |     
3        | A        | ABCD  
3        | B        | ABCD  
3        | C        | ABCD  
3        | D        | ABCD  

在下一步中,我们需要对具有连接ABCD的行进行子集化。然后,输出将是:

Column_A | Column_B  
---------|----------  
2        |  X  

然后和以前一样,我们只需在 C 列中分配 X,最终输出如下所示:

Column_A | Column_B | Column_C  
---------|----------|-----------  
1        | A        | ABCD  
1        | B        | ABCD  
1        | C        | ABCD  
1        | D        | ABCD  
2        | B        | ABCD  
2        | C        | ABCD  
2        | D        | ABCD  
2        | X        | X      
3        | A        | ABCD  
3        | B        | ABCD  
3        | C        | ABCD  
3        | D        | ABCD

上表应该是我们的最终输出。有没有一种优雅的方法可以使用 r/python 来执行此操作?请注意,数据帧中还有更多行,需要一个迭代解决方案来子集化数据帧。

谢谢

一种方法是使用tidyverse,将所有Column_C替换为唯一组的max,确定哪些Column_B包含在Column_C中(使用grepl(,并将未包含的替换为"X",即

library(tidyverse)
df %>% 
group_by(Column_C) %>% 
mutate(new = n_distinct(Column_A)) %>% 
ungroup() %>% 
mutate(Column_C = Column_C[max(new)]) %>% 
rowwise() %>% 
mutate(Column_C = replace(Column_C, !grepl(Column_B, Column_C), 'X')) %>% 
select(-new)
Source: local data frame [12 x 3]
Groups: <by row>
# A tibble: 12 x 3
#   Column_A Column_B Column_C
#      <int>    <chr>    <chr>
# 1        1        A     ABCD
# 2        1        B     ABCD
# 3        1        C     ABCD
# 4        1        D     ABCD
# 5        2        B     ABCD
# 6        2        C     ABCD
# 7        2        D     ABCD
# 8        2        X        X
# 9        3        A     ABCD
#10        3        B     ABCD
#11        3        C     ABCD
#12        3        D     ABCD

我相信如果我们从purrr切换具有map*函数的rowwise()操作,这会更有效,但我现在无法做到这一点。

最新更新