2014-09-24 7 views
6

यह प्रश्न group weighted means पर एक और का अनुसरण करता है: मैं data.table का उपयोग करके भारित औसत-समूह औसत बनाना चाहता हूं। प्रारंभिक प्रश्न के साथ अंतर यह है कि चर के वेरिएबल के नाम स्ट्रिंग वेक्टर में निर्दिष्ट हैं।समूहों द्वारा (डेटाटेबल में) कई स्तंभों के लिए भारित साधन

डेटा:

df <- read.table(text= " 
      region state county weights y1980 y1990 y2000 
      1  1  1  10  100 200  50 
      1  1  2  5  50 100 200 
      1  1  3  120 1000 500 250 
      1  1  4  2  25 100 400 
      1  1  4  15  125 150 200 
      2  2  1  1  10  50 150 
      2  2  2  10  10  10 200 
      2  2  2  40  40 100  30 
      2  2  3  20  100 100  10 
", header=TRUE, na.strings=NA) 

ऊपर उल्लिखित सवाल से रोलाण्ड के सुझाव उत्तर का उपयोग करना:

library(data.table) 
dt <- as.data.table(df) 
dt2 <- dt[,lapply(.SD,weighted.mean,w=weights),by=list(region,state,county)] 

मैं तार के साथ एक वेक्टर गतिशील स्तंभों जिसके लिए मैं अंदर-समूह भारित औसत चाहते हैं निर्धारित करने के लिए किया है।

colsToKeep = c("y1980","y1990") 

लेकिन मुझे नहीं पता कि डेटाटेबल जादू के लिए इसे तर्क के रूप में कैसे पास किया जाए।

मैं

dt[,lapply(
     as.list(colsToKeep),weighted.mean,w=weights), 
     by=list(region,state,county)]` 

कोशिश की, लेकिन मैं तो मिलती है:

Error in x * w : non-numeric argument to binary operator 

सुनिश्चित नहीं हैं कि प्राप्त करने के लिए मैं क्या चाहते हैं।

बोनस प्रश्न: मैं V1 और V2 प्राप्त करने के बजाय मूल कॉलम नाम रखना चाहता हूं।

एनबी मैं डेटा.table पैकेज के संस्करण 1.9.3 का उपयोग करता हूं।

उत्तर

8

आम तौर पर के रूप में, तुम क्या करने में सक्षम होना चाहिए यह है कि:

dt2 <- dt[,lapply(.SD,weighted.mean,w=weights), 
      by = list(region,state,county), .SDcols = colsToKeep] 

अर्थात, बस .SDcols करने के लिए सिर्फ उन स्तंभों प्रदान करके। लेकिन फिलहाल, यह due to a bug पर काम नहीं करेगा, उस weights कॉलम में उपलब्ध नहीं होगा क्योंकि यह .SDcols में निर्दिष्ट नहीं है।

तक वह निश्चित होती है, तो हम इस प्रकार यह पूरा कर सकते हैं:

dt2 <- dt[, lapply(mget(colsToKeep), weighted.mean, w = weights), 
      by = list(region, state, county)] 
# region state county  y1980 y1990 
# 1:  1  1  1 100.0000 200.0000 
# 2:  1  1  2 50.0000 100.0000 
# 3:  1  1  3 1000.0000 500.0000 
# 4:  1  1  4 113.2353 144.1176 
# 5:  2  2  1 10.0000 50.0000 
# 6:  2  2  2 34.0000 82.0000 
# 7:  2  2  3 100.0000 100.0000 
+0

बग अभी भी मौजूद है या है पहला दृष्टिकोण अब अनुशंसित नहीं है? 16 दिसंबर 2015 को, मुझे यह मिलता है: 'त्रुटि में त्रुटि। डबल (डब्ल्यू): प्रकार 'डबल'' – PatrickT

+1

प्रकार के वेक्टर को 'बंद' प्रकार को कॉरर्स नहीं कर सकता है, क्षमा करें :-(। आप कर सकता था: 'डीटी [, लापरवाही (भूलभुलैया (colsToKeep), weighted.mean, w = भार), =। (क्षेत्र, राज्य, देश)]। आपकी त्रुटि यह इंगित करती है कि आप 'as.double' का उपयोग कर रहे हैं इनपुट के रूप में एक फ़ंक्शन के साथ (जो असंबंधित है)। – Arun

+0

धन्यवाद। इसलिए अनिवार्य रूप से आपका सुझाव '' mget() '' 'as'list (.SD) []' 'के बजाय' 'mget()' 'का उपयोग करना है?(मुझे पता है कि ''by =' 'के बाद आप जिस बिंदु का उपयोग करते हैं वह' 'list'' के लिए एक शॉर्टेंड है, ताकि कोड का थोड़ा सा उपरोक्त आपके वर्कअराउंड जैसा ही हो) (त्रुटि संदेश के बारे में, मुझे लगता है कि मैं केवल कॉपी करता हूं - ओपी के डेटा को दबाया, लेकिन डेटा.फ्रेम के माध्यम से नहीं गए।) – PatrickT

0

मुझे data.table पता नहीं है लेकिन क्या आपने dplyr का उपयोग करने पर विचार किया है? मुझे लगता है कि यह लगभग रूप में तेजी से data.table

library(dplyr) 
df %>% 
    group_by(region, state, county) %>% 
    summarise(mean_80 = weighted.mean(y1980, weights), 
      mean_90 = weighted.mean(y1990, weights)) 
Source: local data frame [7 x 5] 
Groups: region, state 

    region state county mean_80 mean_90 
1  1  1  1 100.0000 200.0000 
2  1  1  2 50.0000 100.0000 
3  1  1  3 1000.0000 500.0000 
4  1  1  4 113.2353 144.1176 
5  2  2  1 10.0000 50.0000 
6  2  2  2 34.0000 82.0000 
7  2  2  3 100.0000 100.0000 
+0

आपकी मदद के लिए धन्यवाद, लेकिन मैं data.table उपयोग करने की आवश्यकता है, और यह भी अपने जवाब मेरे सवाल का, की नई बाधा को संबोधित नहीं करता जो क्या कॉलम को वेक्टर द्वारा गतिशील रूप से निर्दिष्ट करना है। – Peutch

+0

मेरा बुरा, मुझे आपकी पोस्ट को और अधिक ध्यान से पढ़ना चाहिए था। यदि आप dplyr पर स्विच करने का निर्णय लेते हैं, [यहां] [http://stackoverflow.com/questions/26003574/r-dplyr-mutate-use-dynamic-variable-names) एक उदाहरण जो सहायक हो सकता है – kferris10

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