串联行和删除行基于其
问题描述:
我有一个数据帧其内容是这样的:串联行和删除行基于其
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,我们在列两个不重复的*表
此下一步将在列被分配ABCD D用于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
,通过独特群体的max
全部更换Column_C
,识别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
我相信,这可能是更有效的。如果我们用map*
功能切换rowwise()
操作从purrr
但我不是能够在此刻做。
到目前为止您尝试过什么? – anon
我是R/Python的新手,不知道如何继续进行下去。 – anathema1987