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 संस्करण के लिए रूपांतरण भी साथ तेज है।
लाइन 2 –