2017-07-25 56 views
0

我有一个数据帧其内容是这样的:串联行和删除行基于其

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来执行此操作?请注意,我们在数据框中有更多的行,并且需要迭代解决方案来对数据框进行子集化。

感谢

+0

到目前为止您尝试过什么? – anon

+0

我是R/Python的新手,不知道如何继续进行下去。 – anathema1987

回答

0

一种方法是使用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但我不是能够在此刻做。