2012-06-08 17 views
10

तो, मैं दो कारकों और इतने की तरह एक सांख्यिक चर के साथ एक डेटा फ्रेम:आर में लापता कारकों के संयोजन हैंडलिंग

>D 
f1 f2 v1 
1 A 23 
2 A 45 
2 B 27 
    . 
    . 
    . 

तो f1 के स्तर 1 और 2 हैं और f2 के स्तर को एक कर रहे हैं और बी। यह बात है, एफ 1 = 1 और एफ 2 = बी (जो डी $ वी 1 [डी $ एफ 1 = 1 & डी $ एफ 2 = बी] नहीं है) वास्तविकता में यह होना चाहिए शून्य।

मेरे वास्तविक डेटा फ्रेम में मेरे पास एफ 1 के 11 स्तर और एफ 2 के 150 स्तरों के करीब है और मुझे अपने डेटा फ्रेम से गायब होने वाले f1 और f2 के प्रत्येक संयोजन के लिए v1 = 0 के साथ एक अवलोकन बनाना होगा।

मैं यह करने के बारे में कैसे जाउंगा?

अग्रिम धन्यवाद,

इयान

उत्तर

11

अपने डेटा का उपयोग करना:

dat <- data.frame(f1 = factor(c(1,2,2)), f2 = factor(c("A","A","B")), 
        v1 = c(23,45,27)) 

एक विकल्प के स्तर के संयोजन के साथ एक लुकअप तालिका बनाने के लिए है, जो expand.grid() समारोह की आपूर्ति का उपयोग किया जाता जैसा कि नीचे दिखाया गया है, दोनों कारकों के स्तर के साथ:

dat2 <- with(dat, expand.grid(f1 = levels(f1), f2 = levels(f2))) 

एक डेटाबेस की तरह आपरेशन में शामिल होने तो merge() समारोह है जिसमें हम यह दर्शाते हैं कि लुकअप तालिका से सभी मूल्यों में शामिल हैं का उपयोग किया जा सकता है में शामिल होने के (all.y = TRUE)

newdat <- merge(dat, dat2, all.y = TRUE) 

ऊपर लाइन का उत्पादन:

> newdat 
    f1 f2 v1 
1 1 A 23 
2 1 B NA 
3 2 A 45 
4 2 B 27 

जैसा कि आप देख सकते हैं, गायब संयोजनों को मूल्य NA दिया जाता है जो लापता-नस्ल को इंगित करता है। यह तो 0 रों के साथ इन NA रों को बदलने के लिए realtively सरल है:

> newdat$v1[is.na(newdat$v1)] <- 0 
> newdat 
    f1 f2 v1 
1 1 A 23 
2 1 B 0 
3 2 A 45 
4 2 B 27 
+0

@ user1443010 उस लाइन में, मैं इसका उपयोग 'dat $ f1' और' dat $ f2' से बचने के लिए कर रहा हूं। मुझे यह भी लगता है कि यह इरादा स्पष्ट करता है; * यह * ऑब्जेक्ट का उपयोग करके, * वह * करें। उपयोगकर्ता स्तर पर इसके साथ कुछ भी गलत नहीं है, लेकिन एक दक्षता दंड है क्योंकि आर को वस्तु की सामग्री के साथ एक नया वातावरण बनाना है और इसमें समय लगता है। 'dat2 <- expand.grid (f1 = स्तर (डेटा $ f1), f2 = स्तर (डेटा $ f2)) 'विकल्प होगा। आप हमेशा चीजों को '() 'में नहीं कर सकते हैं; मुझे नहीं लगता कि 'एनए' को बदलने वाली रेखा को आसानी से '() 'में बदल दिया जा सकता है, लेकिन मुझे कुछ याद आ रहा है। –

+0

अद्भुत! धन्यवाद! ;) – maycca

1

दो साल देर से, लेकिन मैं एक ही समस्या थी और इस plyr समाधान के साथ आया था:

dat <- data.frame(f1 = factor(c(1,2,2)), f2 = factor(c("A","A","B")), v1 = c(23,45,27)) 

newdat <- ddply(dat, .(f1,f2), numcolwise(function(x) {if(length(x)>0) x else 0.0}), .drop=F) 

> newdat 
    f1 f2 v1 
1 1 A 23 
2 1 B 0 
3 2 A 45 
4 2 B 27 
2

मैं tidyr जोड़ने समाधान, fill=0 और एकत्रण के साथ फैल रहा है।

library(tidyr) 
df %>% spread(f2, v1, fill=0) %>% gather(f2, v1, -f1) 

# f1 f2 v1 
#1 1 A 23 
#2 2 A 45 
#3 1 B 0 
#4 2 B 27 

आप समान रूप से df %>% spread(f1, v1, fill=0) %>% gather(f1, v1, -f2) कर सकते हैं।

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