2016-02-29 45 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