2009-09-22 20 views
5

मैं कई चर से मूल्य कैसे जोड़ूं?एकाधिक कॉलम जोड़ना, एकाधिक चर के साथ बदलना

अगर मैं सिर्फ दो चर (कॉलम) था मैं बस जा सकते हैं:

summation.variable <- variable1 + variable2 

या अगर यह सब एक dataframe में था:

transform(dataframe, summation.col = column1 + column2) 

मैं यह कर कैसे करूँ अगर मैं के बारे में है 10 चर और मैं प्रत्येक को col1 + col2 + col3 + col4 में टाइप नहीं करना चाहता हूं। मामलों को और खराब बनाने के लिए मेरे कॉलम में काफी लंबे नाम हैं और कभी-कभी मेरे द्वारा उपयोग किए जाने वाले सटीक कॉलम बदल सकते हैं। मेरे पास एक चरित्र वेक्टर है जिसमें सभी प्रासंगिक कॉलम नाम हैं लेकिन इसका उपयोग नहीं किया जा सकता है।

निम्नलिखित बेकार है क्योंकि यह हर पंक्ति में प्रत्येक कॉलम में प्रत्येक मान जोड़ता है और पूरे लॉट के लिए एक एकल मूल्य देता है।

sum(metrics) 
+0

लाइन 2 –

उत्तर

8

आप

tmp <- data.frame(a=1:2,b=3:4,d=5:6) 
rowSums(tmp[,c("a","d")]) 

या अधिक सामान्य रूप से लागू होते हैं rowSums उपयोग करना चाहते हैं (एक चरित्र वेक्टर साथ अनुक्रमण देखें।):

apply(tmp[,c("a","d")], 1, sum) 
1

मैं सिर्फ इस सवाल का जवाब मिल गया। मुझे पता था कि मुझे कुछ प्रकार की राशि चाहिए। मैं "योग" देखने के लिए आर मदद के लिए गया था। और वहां मैंने पाया। उत्तर "colSums" लिंक को "rowSums" पर फ़ॉलो करना है। तो जहां मेट्रिक्स प्रासंगिक कॉलम नामों का एक चरित्र वेक्टर है। निम्नलिखित पंक्ति वेक्टर उत्पन्न करती है जहां सभी पंक्तियों को प्रत्येक पंक्ति में जोड़ा जाता है।

rowSums(data.frame[metrics]) 

कोई व्यक्ति यह कैसे करेगा यदि कोई प्रत्येक मूल्य को एक-दूसरे से गुणा करना चाहता था? मुझे एक पंक्ति उत्पाद नहीं दिख रहा है।

+0

पर चर की वर्तनी की जाँच मुझे लगता है कि मैं, उत्पादों ऐसा करने के लिए लागू समारोह (या कुछ अन्य समारोह) का उपयोग करेंगे जाँच? – PaulHurleyuk

+0

rowSums लागू summations के लिए – Thierry

4

ऑपरेशन के इस तरह करने के लिए कई तरीके हैं, (। यानी एक पंक्ति या स्तंभ में एक समारोह लागू) हैं, लेकिन के रूप में एडुआर्डो बताते हैं, लागू सबसे बुनियादी है:

tmp <- data.frame(a=1:2,b=3:4,d=5:6) 
apply(tmp, 1, prod) 

यह एक बहुत ही है लचीला समारोह। उदाहरण के लिए, आप इस कॉल के साथ एक बार में दोनों कार्य कर सकते हैं:

apply(tmp, MARGIN=1, function(x) c(sum(x), prod(x))) 

कॉलम में एक ही विश्लेषण प्रदर्शन भी सरल है (मार्जिन पैरामीटर का वर्णन करता है कि क्या आप पंक्तियों या स्तंभों का उपयोग करें):

apply(tmp, MARGIN=2, function(x) c(sum(x), prod(x))) 
3

Farrel answer का जवाब:

पंक्तिप्रॉड के लिए RSeek पर मुझे दो पैकेज - matrixStats और fUtilities मिले। आप उन्हें देख सकते थे।

दूसरा समाधान थोड़ा मुश्किल है। आप अभिव्यक्ति बना सकते हैं और उनका मूल्यांकन कर सकते हैं।

X <- structure(list(
    varA = c(0.98, 0.75, -0.56, -1.43, 0.65, -1.15, -1.52, 0.1, 0.06, 0.76), 
    varB = c(-0.12, -0.6, 0.62, 0.9, -0.44, 0.37, 0.62, 0.76, -1.61, -0.26), 
    varC = c(-0.5, -0.37, -0.43, -0.7, 0.83, -0.24, -0.57, 0.05, -1.31, 0.7), 
    varD = c(-0.06, -0.11, 1.03, -1.76, -0.42, -1.21, -0.62, -1, -1.16, 2.13), 
    varE = c(-1.96, 0.69, -1.85, -1.74, -1.47, 1.24, 0.29, -1.18, 0.89, 0.42), 
    varF = c(0.29, -0.22, -1.29, 1.19, 0.38, -0.23, -0.5, -1.07, -1.83, 0.58), 
    varG = c(0.59, -0.41, -1.37, 0.89, -0.75, 0.95, 0.95, -0.9, 0.71, -1.3) 
), 
    .Names = c("varA", "varB", "varC", "varD", "varE", "varF", "varG"), 
    row.names = c(NA, -10L), class = "data.frame" 
) 

metrics <- c("varB","varC","varF") 

eval(
    parse(text = paste(metrics,collapse=" * ")), 
    envir = X 
) 

कुछ स्पष्टीकरण:

  • पेस्ट एक स्ट्रिंग बनाने varB * varC * varF की तरह लग रहा
  • पार्स अभिव्यक्ति
  • eval के लिए पाठ परिवर्तित करने के लिए है (पतन वेक्टर के तत्वों को श्रृंखलाबद्ध के लिए है) envir = X एक्स

के भीतर अभिव्यक्ति निष्पादित करना है, आपके मूल प्रश्न के लिए आप कोल का उपयोग कर सकते हैं चूक = "+"।

संपादित करें: यदि आपके चर डेटा.फ्रेम में नहीं हैं तो पर्यावरण के बिना eval पर्याप्त है।

EDIT2: उल्लेख किया संकुल से rowProds उपयोग करने के उदाहरण:

matrixStats::rowProds(as.matrix(X[,metrics])) # convert to a matrix is needed 
fUtilities::rowProds(X[,metrics]) # without conversion 

मैं इस कार्यों स्रोत में Digg और:

  • fUtilities लागू उपयोग करते हैं, तो यह एक ही लागू होते हैं के रूप में है (एक्स, 1 , प्रोड) (यह कुशल आत्मा नहीं है)
  • matrixStats स्मार्ट है और एक्स (पंक्तिसमूह (लॉग (एक्स)) की तरह कुछ करें), तो तेज़ी से होना चाहिए।

गति परीक्षण:

Xm <- matrix(rnorm(50000*8),ncol=8) 
Xd <- as.data.frame(Xm) 

require(fUtilities) 
require(matrixStats) 
system.time(matrixStats::rowProds(as.matrix(Xd))) 
# user system elapsed 
# 0.08 0.02 0.09 
system.time(matrixStats::rowProds(Xm)) 
# user system elapsed 
# 0.08 0.00 0.08 
system.time(fUtilities::rowProds(Xd)) 
# user system elapsed 
# 0.52 0.00 0.52 

एक मैट्रिक्स matrixStats संस्करण के लिए रूपांतरण भी साथ तेज है।

+1

पुस्तकालय लागू के एक अधिक कुशल संस्करण है (भाग्य) ; भाग्य (106) – Thierry

+0

मैं do.call (f, as.list (X [, metrics]) का उपयोग करना चाहता हूं) लेकिन मुझे f (a, b, c) = a * b * जैसे काम करने वाला कोई फ़ंक्शन नहीं मिल रहा है। सी। अच्छी टिप्पणी btw;) – Marek

+0

'prod()' – hadley

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