2016-02-29 43 views
5

我的問題是基於此questionR:根據其他列填充和/或複製行

我有一個數據如下。我想先填滿單元格,然後再查看,只要單元格是相同的。在bom = A的情況下,我想填充如圖所示的行。但在BOM = B的情況下,作爲type_p列是不同的,我要複製的行和感覺坯料

bom=c(rep("A",4),rep("B",3)) 
Part=c("","lambda","beta","","tim","tom","") 
type_p=c("","sub","sub","","sub","pan","") 
ww=c(1,2,3,4,1,2,3) 
df=data.frame(bom,Part,type_p,ww) 

> df 
    bom Part type_p ww 
1 A    1 
2 A lambda sub 2 
3 A beta sub 3 
4 A    4 
5 B tim sub 1 
6 B tom pan 2 
7 B    3 

我想要的最終數據是如下

bom Part type_p ww 
1 A lambda sub  1 
2 A lambda sub  2 
3 A beta sub  3 
4 A beta sub  4 
5 B tim  sub  1 
6 B tim  sub  2 
7 B tim  sub  3 
5 B tom  pan  1 
6 B tom  pan  2 
7 B tom  pan  3 

________________________________________Update 1

我想要的邏輯如下。請記住,我的數據非常龐大,每列中都有數千個值。

BOM和WW列總是會填充/填充輸入數據

  1. 檢查是否在列BOM中的條目在type_p
  2. 列大於1倍的值如果只有1值,則填補空白在type_p和ww列中,先查看然後查找。在這種情況下,bom = A在type_p(sub)中只有一個值
  3. 如果column bom中的條目在type_p列中有多個唯一值,則創建該bom的相同行的附加集合,以使總集合爲等於該bom的type_p列中的不同值。在這種情況下BOM = B在type_p兩個值(子和平移)先向下看,然後查找在type_p和ww列
  4. 填充空白(看源行填補值)

================================================ ===========更新2

步驟3之後,該數據幀將類似於下面

> df 
    bom Part type_p ww 
1 A lambda sub 1 
2 A lambda sub 2 
3 A beta sub 3 
4 A beta sub 4 
5 B tim sub 1 
6 B    2 
7 B    3 
8 B    1 
9 B tom pan 2 
10 B    3 
+0

這是一個非常可解決的問題,但是你的例子並不遵循你的邏輯 - 你需要在步驟3的時候更加清晰,以及在重複的情況下行或行的填充情況。我會建議在你的例子中顯示中間數據框(這也可能幫助你解決頭部問題) – Chris

+0

我添加了更新2. – user2543622

+0

這就是我的想法 - 所以這看起來違反了你的填充原則。第8行不應該是'tim sub'嗎? – Chris

回答

3

隨着tidyrdplyr,你可以設法做到接近你的目標是什麼

library(tidyr) 
library(dplyr) 
# replacing empty string with NA 
df <- df %>% mutate_each(funs(sub("^$", NA, .)), Part, type_p) 
# filling missing values 
df <- df %>% fill(Part, type_p,.direction = "down") %>% fill(Part, type_p,.direction = "up") 

df 
#> bom Part type_p ww 
#> 1 A lambda sub 1 
#> 2 A lambda sub 2 
#> 3 A beta sub 3 
#> 4 A beta sub 4 
#> 5 B tim sub 1 
#> 6 B tom pan 2 
#> 7 B tom pan 3 

爲了得到你所描述的(問題和意見)的東西,你可以把BOM一個& B相分別:

bind_rows(
    df %>% filter(bom == "A"), 
    df %>% filter(bom == "B") %>% 
    complete(nesting(bom, Part, type_p), ww) 
) 
#> Source: local data frame [10 x 4] 
#> 
#>  bom Part type_p ww 
#> (fctr) (chr) (chr) (dbl) 
#> 1  A lambda sub  1 
#> 2  A lambda sub  2 
#> 3  A beta sub  3 
#> 4  A beta sub  4 
#> 5  B tim sub  1 
#> 6  B tim sub  2 
#> 7  B tim sub  3 
#> 8  B tom pan  1 
#> 9  B tom pan  2 
#> 10  B tom pan  3 
+0

,我不想重複行,因爲部分beta和lambda都是type_c = sub。但是在Bom的情況下,我想要重複行,因爲部分tim和tom是不同的type_p - sub和pan。在ww的情況下,對於B,我不希望ww = 4,因爲它不是原始數據。僅供參考:Bom A和Bom B完全沒有關係/他們是獨立的 – user2543622

+0

是否可以分別對待A和B?您可以從我的第一個'df', 'bind_rows( df%>%filter(bom ==「A」), df%>%filter(bom ==「B」 )%>% complete(nesting(bom,Part,type_p),ww))' – cderv

+0

請修改youw答案,以便我可以接受它 – user2543622