2016-02-29 6 views
5

मेरा प्रश्न यह question पर आधारित है डुप्लिकेट।आर: को आबाद करने और/या अन्य स्तंभों पर आधारित पंक्तियों

मैं नीचे के रूप में एक डेटा की है। मैं पहले देखकर कोशिकाओं को भरना चाहता हूं और फिर जब तक बम समान होता है तब तक देखकर। बम = ए के मामले में, मैं दिखाए गए पंक्तियों को भरना चाहता हूं। लेकिन bom = बी के मामले में, के रूप में 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 मूल्य तो रिक्त स्थान को भरने टाइप_पी और डब्ल्यूडब्लू कॉलम में पहले देखकर और फिर देखकर। इस मामले bom में = एक (उप)
  3. type_p में केवल एक ही मूल्य है स्तंभ bom में एक प्रविष्टि तो उस bom का एक ही पंक्तियों की अतिरिक्त सेट ऐसा है कि कुल सेट हो जाएगा बनाने type_p स्तंभ में 1 से अधिक अद्वितीय मान है, तो उस बम के लिए type_p कॉलम में विशिष्ट मानों के बराबर। इस मामले में bom = बी (उप और पैन) पहले नीचे की तलाश में है और फिर ऊपर देखकर भी type_p और ww स्तंभों में
  4. भरण कारतूस type_p में दो मान होते हैं (स्रोत पंक्ति पर देखने के मूल्यों को भरने के लिए)

================================================ =========== अद्यतन 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

मुझे लगता है मैं क्या सोचा Thats अद्यतन 2. – user2543622

+0

जोड़ा - तो ऐसा लगता है यह नीचे अपने को भरने सिद्धांत का उल्लंघन करता है। पंक्ति 8 को 'समय उप' नहीं होना चाहिए? – Chris

उत्तर

3

लगेगा tidyr और ०१२३४५२०७८९ के साथ, तुम क्या आप

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 

उद्देश्य को प्राप्त करने के आप क्या वर्णित (प्रश्न और टिप्पणी में) के पास कुछ करने के लिए प्रबंधन कर सकते हैं, तो आप का इलाज कर सकता है बीओएम एक अलग & बी:

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

को भी अपडेट किया है, मैं पंक्तियों को दोहराना नहीं चाहता क्योंकि दोनों भागों बीटा और लैम्ब्डा टाइप_c = उप हैं। लेकिन बम बी के मामले में, मैं पंक्तियों को दोहराना चाहता हूं क्योंकि भाग-समय और टॉम अलग-अलग टाइप_पी - सब और पैन हैं। इसके अलावा ww के मामले में, बी के लिए, मैं ww = 4 नहीं चाहता क्योंकि यह मूल डेटा में नहीं था। एफवाईआई: बॉम ए और बॉम बी का कोई संबंध नहीं है/वे स्वतंत्र हैं – user2543622

+0

क्या ए और बी को अलग से इलाज करना संभव है? आप परिणाम तुम क्या कर करना चाहते हैं, मेरा पहला 'df' से, ' bind_rows ( df%>% फिल्टर (bom == 'ए'), df%>% फिल्टर (bom == 'बी' हो सकता था)%>% पूर्ण (घोंसला (बम, भाग, टाइप_पी), ww)) ' – cderv

+0

कृपया अपने उत्तर को संशोधित करें ताकि मैं इसे स्वीकार कर सकूं – user2543622

संबंधित मुद्दे