2017-07-25 89 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但我不是能夠在此刻做。