2012-02-17 9 views
12

मेरे पास सैलामैंडर्स की गड़बड़ी से विभिन्न आर्थ्रोपोडों की लंबाई और चौड़ाई के साथ डेटाफ्रेम है। चूंकि कुछ गड़बड़ों में हजारों निश्चित शिकार वस्तुएं थीं, इसलिए मैंने केवल प्रत्येक शिकार प्रकार का एक सबसेट मापा। अब मैं प्रत्येक अनिश्चित व्यक्ति को उस शिकार के लिए औसत लंबाई और चौड़ाई के साथ प्रतिस्थापित करना चाहता हूं। मैं डेटाफ्रेम रखना चाहता हूं और केवल लगाए गए कॉलम (लंबाई 2, चौड़ाई 2) जोड़ना चाहता हूं। मुख्य कारण यह है कि प्रत्येक पंक्ति में सैलामैंडर की तारीख और स्थान पर डेटा के साथ कॉलम भी होते हैं। मैं मापा गया व्यक्तियों के यादृच्छिक चयन के साथ एनए भर सकता हूं लेकिन तर्क के लिए मान लीजिए कि मैं प्रत्येक एनए को माध्य के साथ बदलना चाहता हूं।आर में सबसेट (पीएलआर के साथ बाधा?) द्वारा एसए को प्रतिस्थापित करने के लिए एनए को कैसे बदलें

उदाहरण के लिए कल्पना मैं एक dataframe कि तरह दिखता है:

id taxa  length width 
101 collembola 2.1  0.9 
102 mite  0.9  0.7 
103 mite  1.1  0.8 
104 collembola NA  NA 
105 collembola 1.5  0.5 
106 mite  NA  NA 

हकीकत में मैं और अधिक कॉलम और के बारे में 25 विभिन्न taxa और कुल में ~ 30,000 शिकार आइटम के कुल की है। ऐसा लगता है कि प्लीयर पैकेज इसके लिए आदर्श हो सकता है लेकिन मैं यह नहीं समझ सकता कि यह कैसे करें। मैं बहुत आर या प्रोग्रामिंग समझदार नहीं हूं लेकिन मैं सीखने की कोशिश कर रहा हूं।

ऐसा नहीं है कि मुझे पता है कि मैं क्या कर रहा हूं लेकिन अगर यह मदद करता है तो मैं खेलने के लिए एक छोटा डेटासेट बनाने की कोशिश करूंगा।

exampleDF <- data.frame(id = seq(1:100), taxa = c(rep("collembola", 50), rep("mite", 25), 
rep("ant", 25)), length = c(rnorm(40, 1, 0.5), rep("NA", 10), rnorm(20, 0.8, 0.1), rep("NA", 
5), rnorm(20, 2.5, 0.5), rep("NA", 5)), width = c(rnorm(40, 0.5, 0.25), rep("NA", 10), 
rnorm(20, 0.3, 0.01), rep("NA", 5), rnorm(20, 1, 0.1), rep("NA", 5))) 

यहाँ कुछ चीजें मैं कोशिश की है (कि काम नहीं किया) कर रहे हैं:

# mean imputation to recode NA in length and width with means 
    (could do random imputation but unnecessary here) 
mean.imp <- function(x) { 
    missing <- is.na(x) 
    n.missing <-sum(missing) 
    x.obs <-a[!missing] 
    imputed <- x 
    imputed[missing] <- mean(x.obs) 
    return (imputed) 
    } 

mean.imp(exampleDF[exampleDF$taxa == "collembola", "length"]) 

n.taxa <- length(unique(exampleDF$taxa)) 
for(i in 1:n.taxa) { 
    mean.imp(exampleDF[exampleDF$taxa == unique(exampleDF$taxa[i]), "length"]) 
} # no way to get back into dataframe in proper places, try plyr? 

एक और प्रयास:

imp.mean <- function(x) { 
    a <- mean(x, na.rm = TRUE) 
    return (ifelse (is.na(x) == TRUE , a, x)) 
} # tried but not sure how to use this in ddply 

Diet2 <- ddply(exampleDF, .(taxa), transform, length2 = function(x) { 
    a <- mean(exampleDF$length, na.rm = TRUE) 
    return (ifelse (is.na(exampleDF$length) == TRUE , a, exampleDF$length)) 
    }) 
कोई सुझाव

plyr का उपयोग कर या नहीं?

+7

आपको मूल्यों को लागू करने के लिए पैकेज * चूहों * पर विचार करना चाहिए। –

+1

'mi' पैकेज भी काफी अच्छा है। 'अमेलिया' या तो 'चूहों' या 'मील' की तुलना में बहुत तेज़ है, लेकिन यह आपके चर पर निर्भर करता है जो बहुविकल्पीय सामान्य – richiemorrisroe

उत्तर

37

नहीं अपने ही तकनीक मैं एक समय पहले बोर्डों पर इसे देखा:

dat <- read.table(text = "id taxa  length width 
101 collembola 2.1  0.9 
102 mite  0.9  0.7 
103 mite  1.1  0.8 
104 collembola NA  NA 
105 collembola 1.5  0.5 
106 mite  NA  NA", header=TRUE) 


library(plyr) 
impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE)) 
dat2 <- ddply(dat, ~ taxa, transform, length = impute.mean(length), 
    width = impute.mean(width)) 

dat2[order(dat2$id), ] #plyr orders by group so we have to reorder 

संपादित एक for पाश के साथ एक गैर plyr दृष्टिकोण:

for (i in which(sapply(dat, is.numeric))) { 
    for (j in which(is.na(dat[, i]))) { 
     dat[j, i] <- mean(dat[dat[, "taxa"] == dat[j, "taxa"], i], na.rm = TRUE) 
    } 
} 

संपादित कई चन्द्रमाओं बाद में यहां एक डेटा.table & dplyr एपी है proach:

data.table

library(data.table) 
setDT(dat) 

dat[, length := impute.mean(length), by = taxa][, 
    width := impute.mean(width), by = taxa] 

dplyr

library(dplyr) 

dat %>% 
    group_by(taxa) %>% 
    mutate(
     length = impute.mean(length), 
     width = impute.mean(width) 
    ) 
+3

@djhocking धन्यवाद हैडली मुझे पता चला कि मैंने इसे कहां से चुरा लिया है: [(LINK)] (http: // www.mail-archive.com/[email protected]/msg58289.html) –

2

इस का जवाब दे करने से पहले, मैं कहना है कि इसलिए आर में अभी शुरुआत कर रहा हूँ चाहते हैं, तो कृपया अगर आपको लगता है कि मेरा जवाब गलत है तो मुझे बताएं।

कोड:

DF[is.na(DF$length), "length"] <- mean(na.omit(telecom_original_1$length)) 

और लागू चौड़ाई के लिए एक ही।

डीएफ डेटा.फ्रेम के नाम के लिए खड़ा है।

धन्यवाद, Parthi

0

@Tyler Rinker के समाधान पर विस्तार, मान लीजिए features स्तंभों लिए आरोपित करने के लिए कर रहे हैं। इस मामले में features <- c('length', 'width')। फिर data.table का उपयोग समाधान बन जाता है:

library(data.table) 
setDT(dat) 

dat[, (features) := lapply(.SD, impute.mean), by = taxa, .SDcols = features] 
संबंधित मुद्दे