2015-09-14 8 views
14

के उसी कॉलम के साथ NAs को बदलें, मैं उसी कॉलम के माध्य के साथ डेटा टैबलेट के कॉलम में मौजूद एनएएस को प्रतिस्थापित करना चाहता हूं। मैं निम्नलिखित कर रहा हूँ। लेकिन यह काम नहीं कर रहा है।डेटा.table

ww <- data.table(iris) 

ww <- ww[1:5 , ] 

ww[1,1] <- NA 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:   NA   3.5   1.4   0.2 setosa 
2:   4.9   3.0   1.4   0.2 setosa 
3:   4.7   3.2   1.3   0.2 setosa 
4:   4.6   3.1   1.5   0.2 setosa 
5:   5.0   3.6   1.4   0.2 setosa 


ww[is.na(Sepal.Length) , Sepal.Length:= mean(Sepal.Length, na.rm = T)] 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:   NaN   3.5   1.4   0.2 setosa 
2:   4.9   3.0   1.4   0.2 setosa 
3:   4.7   3.2   1.3   0.2 setosa 
4:   4.6   3.1   1.5   0.2 setosa 
5:   5.0   3.6   1.4   0.2 setosa 

क्यों मैं एनए के स्थान पर NaN हो रही है जब यह मान (4.9, 4.7, 4.6, 5.0) के बाकी के माध्य किया जाना चाहिए था?

इस वाक्यविन्यास में कुछ गलत होने पर इसे स्वीकार करने का विकल्प क्या है?

मैं डेटा तालिका के लिए वाक्यविन्यास चाहता हूं।

+2

समस्या यह है कि आप डाटासेट subsetting रहे पहले, तो 'Sepal.Length' स्तंभ, के लिए एक ऑपरेशन को लागू करने के है जो इस बिंदु पर केवल एक ही 'एनए' है। –

+0

@ अखिल नायर आपको नहीं मिला। क्या आप एक उदाहरण दे सकते हैं? – user3664020

+0

@RHertel आपका समाधान संपूर्ण कॉलम को न केवल एनए को बदल रहा है। – user3664020

उत्तर

21

चिड़ियाघर पैकेज में na.aggregate ही स्तंभ में गैर NAS की औसत के साथ NAS की जगह:

library(zoo) 

ww[, Sepal.Length := na.aggregate(Sepal.Length)] 
+0

मुझे यकीन नहीं है कि na.aggregate अभी भी डेटा.table में एक फ़ंक्शन है ... – colin

+1

'na.aggregate' चिड़ियाघर में एक फ़ंक्शन है। 'लाइब्रेरी 'कथन पर ध्यान दें। –

+0

बहुत बहुत धन्यवाद। एक नई पोस्ट करने से पहले, क्या समाधान को इंडेक्स करने का कोई तरीका है, इसलिए यह गैर-एनए कॉलम का औसत किसी अन्य समूह द्वारा किया जाता है, जैसे कि प्रजातियां? – colin

4

यह पूरे सेपल का मतलब नहीं ले रहा है। लम्बाई कॉलम; केवल 1 कॉलम जिसे आपने चुना है।

बल्कि का उपयोग करें: आधार आर में

ww[is.na(Sepal.Length) , Sepal.Length:= mean(ww$Sepal.Length, na.rm=TRUE)] 
+0

यह वाक्यविन्यास डेटा.table के लिए मान्य है? – user3664020

+0

@ user3664020 अब यह है। – zx8754

+3

वैश्विक दायरे से 'ww' के दायरे में 'Sepal.Length' को कॉल करने के लिए शायद यह खराब अभ्यास है। एक और उदाहरण के साथ, हो सकता है कि आपने कॉलम को फिर से दर्ज किया हो जो बाद में चीजों को पेंच कर देगा यदि आपने वैश्विक स्तर पर 'ww'' कहा था। –

6

:

ww$Sepal.Length[is.na(ww$Sepal.Length)] <- mean(ww$Sepal.Length, na.rm = T) 
+4

क्या आप इस वाक्यविन्यास को data.table में बदल सकते हैं? – user3664020

6

आपका प्रयास तालिका subsetted पहले

> ww[is.na(Sepal.Length)] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1: 

    NA   3.5   1.4   0.2 setosa 

का चयन इसलिए किसी भी आगे के संचालन केवल इन 'देख' सकते हैं पंक्तियां - यानी Sepal.Length केवल एक NA देख सकते हैं।

data.table समाधान जो आप चाहते हैं नीचे है - यह पूरी तालिका को देखता है और एस को ifelse का उपयोग करने के माध्यम से बदल देता है।

ww[, Sepal.Length := ifelse(is.na(Sepal.Length), mean(Sepal.Length, na.rm = TRUE), Sepal.Length)] 
+2

या 'ww [, Sepal.Length: = प्रतिस्थापित करें (सेप्ल.लेथेंथ, is.na (सेपलल लेंथ), मतलब (सेप्ल.लेथेंथ, na.rm = TRUE))] चूंकि' ifelse' आमतौर पर धीमा होता है। परेशान है कि 'Sepal.Length' को चार बार टाइप किया जाना चाहिए। – Frank

8

यह नया निर्भरता की आवश्यकता होती है zoo जवाब बहुत अच्छा है।
केवल data.table का उपयोग करके आप निम्न कार्य कर सकते हैं।

library(data.table) 

# prepare data 
ww = data.table(iris[1:5,]) 
ww[1, Sepal.Length := NA] 

# solution 
ww[, Sepal.Length.mean := mean(Sepal.Length, na.rm = TRUE) # calculate mean 
    ][is.na(Sepal.Length), Sepal.Length := Sepal.Length.mean # replace NA with mean 
    ][, Sepal.Length.mean := NULL # remove mean col 
     ][] # just prints 

यह चिड़ियाघर के की तुलना में बरा लग रहा है हो सकता है, यह प्रदर्शन कुशल के रूप में सभी चरणों का संदर्भ:= द्वारा अद्यतन का उपयोग किया जाता है। डेटाटेबल में by तर्क का उपयोग करके, समूह द्वारा माध्य के साथ एनए को प्रतिस्थापित करने के लिए इसे आसानी से ट्यून किया जा सकता है।

3

tidyr एक समारोह, replace_na आप इस के लिए उपयोग कर सकते हैं में बनाया गया है:

library(tidyr) 
ww %>% replace_na(list(Sepal.Length = mean(.$Sepal.Length, na.rm = TRUE))) 
संबंधित मुद्दे