2013-08-29 13 views
50

मैं डेटा फ़्रेम पर लागू फ़ंक्शन का उपयोग करना चाहता हूं, लेकिन केवल अंतिम 5 कॉलम पर फ़ंक्शन लागू करना चाहता हूं।आर लागू डेटाफ्रेम कॉलम पर लागू करें() फ़ंक्शन

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)}) 

यह y

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)}) 

के सभी स्तंभों के लिए एक लागू होता है यह केवल स्तंभों y के 4-9 करने के लिए एक के लिए लागू होता है, लेकिन बी की कुल वापसी बंद स्ट्रिप्स पहले 3 कॉलम ... मैं अभी भी उनको चाहता हूं, मैं सिर्फ उन पर लागू नहीं करना चाहता हूं।

wifi[,1:3]+B 

जो भी मैं चाहता/चाहता हूं वह भी नहीं करता है।

+1

'द्वारा' कॉल इस सवाल उलझी है। यदि यह प्रासंगिक है तो आपको स्पष्टीकरण के लिए प्रश्न को फिर से लिखना चाहिए (वाईफाई $ कमरा क्या है?)। मैंने नीचे दिए गए मेरे जवाब में अनदेखा कर दिया है। – leif

+0

आप जो परिणाम प्राप्त कर रहे हैं उसके लिए आप 'cbind (y [1: 3], ...)' कर सकते हैं। –

उत्तर

42

एक उदाहरण data.frame और उदाहरण समारोह (सिर्फ सभी मूल्यों को +1)

A <- function(x) x + 1 
wifi <- data.frame(replicate(9,1:4)) 
wifi 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 1 1 1 1 1 1 
#2 2 2 2 2 2 2 2 2 2 
#3 3 3 3 3 3 3 3 3 3 
#4 4 4 4 4 4 4 4 4 4 

data.frame(wifi[1:3], apply(wifi[4:9],2, A)) 
#or 
cbind(wifi[1:3], apply(wifi[4:9],2, A)) 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 2 2 2 2 2 2 
#2 2 2 2 3 3 3 3 3 3 
#3 3 3 3 4 4 4 4 4 4 
#4 4 4 4 5 5 5 5 5 5 

या यहां तक ​​कि का उपयोग करना:

data.frame(wifi[1:3], lapply(wifi[4:9], A)) 
#or 
cbind(wifi[1:3], lapply(wifi[4:9], A)) 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 2 2 2 2 2 2 
#2 2 2 2 3 3 3 3 3 3 
#3 3 3 3 4 4 4 4 4 4 
#4 4 4 4 5 5 5 5 5 5 
+0

क्या कॉलम नंबर से इंडेक्स के लिए '[:]' का उपयोग करने के बजाय नाम से किसी निश्चित कॉलम को इंडेक्स करने के लिए '$' का उपयोग करके ऐसा करने का कोई तरीका है? मैंने उपनाम जोड़ने की कोशिश की: 'उपनाम (वाईफ़ाई) = सी ("ए", "बी", "सी", "डी", "ई", "एफ", "जी", "एच", "मैं") ' लेकिन लापरवाही (वाईफाई $ ई, 2, एक्स) का उपयोग करने का कोई प्रयास नहीं हो रहा था। – skotturi

+5

@skotturi - आप इसे नाम से कई कॉलम इंडेक्स करने के लिए 'wifi [c ("a", "b", "c")]' की तरह कर सकते हैं। – thelatemail

47

lapply शायद apply की तुलना में एक बेहतर विकल्प यहाँ, लागू के रूप में है सबसे पहले आपके डेटा.फ्रेम को एक सरणी में जोड़ता है जिसका अर्थ है कि सभी कॉलमों में एक ही प्रकार होना चाहिए। आपके संदर्भ के आधार पर, इसमें अनपेक्षित परिणाम हो सकते हैं।

पैटर्न है:

df[cols] <- lapply(df[cols], FUN) 

'कॉलम' वेक्टर चर नाम या सूचकांकों हो सकता है। जब भी संभव हो मैं नामों का उपयोग करना पसंद करता हूं (यह कॉलम रीडरिंग के लिए मजबूत है)। तो आपके मामले में यह हो सकता है:

wifi[4:9] <- lapply(wifi[4:9], A) 

स्तंभ नाम का उपयोग करने का एक उदाहरण:

wifi <- data.frame(A=1:4, B=runif(4), C=5:9) 
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x) 
+2

एक छोटा सुधार: वाईफाई <- data.frame (ए = 1: 4, बी = रनिफ़ (4), सी = 5: 8) – jcfaria

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