我有一个数据框,内容如下:
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()
操作,这会更有效,但我现在无法做到这一点。