2015-06-19 4 views
5

बस सोच रहा है कि क्या औसत फ़ंक्शनडेटा में कई कॉलम के लिए गणना की गणना करें। फ्रेम

जैसे कई कॉलम के माध्यम से गणना करना संभव है या नहीं।

mean(iris[,1]) 

संभव है लेकिन नहीं

mean(iris[,1:4]) 

की कोशिश की:

चेतावनी संदेश: mean.default में (आईरिस [, 1

mean(iris[,c(1:4)]) 

इस त्रुटि संदेश मिला : 4]): तर्क संख्यात्मक या तार्किक नहीं है: वापसी आईएनजी एनए

मैं जानता हूँ कि मैं सिर्फ lapply उपयोग कर सकते हैं (आईरिस [, 1: 4], मतलब) या sapply (आईरिस [, 1: 4], मतलब)

+6

'colMeans (आईरिस [, 1: 4])' के बारे में कैसे। डेटा.फ्रेम का मतलब लेना बंद कर दिया गया है। मुझे यकीन नहीं है कि आप काम करने की अपेक्षा क्यों करते हैं जब आप पहले से ही 'sapply/lapply' समाधानों के बारे में जानते हैं। – MrFlick

+0

'कोलमेन' या 'लागू' दृष्टिकोण का उपयोग करें, लेकिन शायद इस तरह के एक प्रश्न के लिए सबसे अच्छा स्टैक ओवरफ्लो की खोज होगी। – SabDeM

उत्तर

6

colMeans का प्रयास करें:

लेकिन कॉलम संख्यात्मक होना चाहिए। आप बड़े डेटासेट के लिए इसके लिए एक टेस्ट जोड़ सकते हैं।

colMeans(iris[sapply(iris, is.numeric)]) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
    5.843333  3.057333  3.758000  1.199333 

बेंचमार्क

dplyr और data.table के लिए लंबे समय से लगता है। शायद कोई सत्यता के लिए निष्कर्षों को दोहरा सकता है।

microbenchmark(
    plafort = colMeans(big.df[sapply(big.df, is.numeric)]), 
    Carlos = colMeans(Filter(is.numeric, big.df)), 
    Cdtable = big.dt[, lapply(.SD, mean)], 
    Cdplyr = big.df %>% summarise_each(funs(mean)) 
) 
#Unit: milliseconds 
# expr  min  lq  mean median  uq  max 
# plafort 9.862934 10.506778 12.07027 10.699616 11.16404 31.23927 
# Carlos 9.215143 9.557987 11.30063 9.843197 10.21821 65.21379 
# Cdtable 57.157250 64.866996 78.72452 67.633433 87.52451 264.60453 
# Cdplyr 62.933293 67.853312 81.77382 71.296555 91.44994 182.36578 

डाटा

m <- matrix(1:1e6, 1000) 
m2 <- matrix(rep('a', 1000), ncol=1) 
big.df <- as.data.frame(cbind(m2, m), stringsAsFactors=F) 
big.df[,-1] <- lapply(big.df[,-1], as.numeric) 
big.dt <- as.data.table(big.df) 
+0

धन्यवाद, मैं सूची लौटने के साथ बहुत लंबे समय तक रुक गया था। –

+0

@ user20650 'colMeans (फ़िल्टर (is.numeric, आईरिस))' –

+0

@ करलोससिनेली; अच्छा .. मैं कभी भी इसका उपयोग नहीं करता हूं और नेगेट इत्यादि फ़िल्टर को देख रहा हूं, यह सिर्फ अनलिस्ट है (लापरवाही (..)), लेकिन फिर से अधिक सिक्युनक्ट – user20650

3

sapply साथ + Filter:

library(dplyr) 
iris %>% summarise_each(funs(mean)) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:  5.843333 3.057333  3.758 1.199333  NA 

डब्ल्यू:

sapply(Filter(is.numeric, iris), mean) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
    5.843333  3.057333  3.758000  1.199333 
dplyr साथ

ith data.table:

library(data.table) 
iris <- data.table(iris) 
iris[,lapply(.SD, mean)] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:  5.843333 3.057333  3.758 1.199333  NA 
+1

शायद 'आईरिस%>% summarise_each (मज़ेदार (मतलब), -स्पीसी)' –

1

आपका ऊपर समाधान संभालने कॉलम सही is.numeric प्रारूप में हैं काम करता है। नीचे उदाहरण देखें:

a <- c(1,2,3) 
mean(a) 

b <- c(2,4,6) 
mean(b) 

d <- c(3,6,9) 

mydata <- cbind(b,a,d) 


mean(mydata[,1:3]) 
+1

यह बिल्कुल सही नहीं है। उपर्युक्त उदाहरण 'data.frame' है और डेटा.फ्रेम पर माध्य का उपयोग करने की कोई विधि नहीं है। आपका उदाहरण (प्रकार) काम करता है क्योंकि आप 'मैट्रिक्स' ('वर्ग (mydata)') का अर्थ ले सकते हैं: लेकिन यह स्तंभ के बजाय समग्र अर्थ देता है। – user20650

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