मुझे अक्सर डेटाफ्रेम/मैट्रिक्स में कॉलम की प्रत्येक जोड़ी में फ़ंक्शन लागू करने और परिणामों को मैट्रिक्स में वापस करने की आवश्यकता होती है। अब मैं हमेशा ऐसा करने के लिए एक लूप लिखता हूं।क्या कोई आर फ़ंक्शन है जो कॉलम की प्रत्येक जोड़ी पर फ़ंक्शन लागू करता है?
df <- data.frame(x=rnorm(100),y=rnorm(100),z=rnorm(100))
n <- ncol(df)
foo <- matrix(0,n,n)
for (i in 1:n)
{
for (j in i:n)
{
foo[i,j] <- cor.test(df[,i],df[,j])$p.value
}
}
foo[lower.tri(foo)] <- t(foo)[lower.tri(foo)]
foo
[,1] [,2] [,3]
[1,] 0.0000000 0.7215071 0.5651266
[2,] 0.7215071 0.0000000 0.9019746
[3,] 0.5651266 0.9019746 0.0000000
जो काम करता है, लेकिन बहुत बड़ी मैट्रिक्स के लिए काफी धीमी है: उदाहरण के लिए, एक मैट्रिक्स सहसंबंध मैं लिखने के पी मूल्यों से युक्त बनाने के लिए।
Papply <- function(x,fun)
{
n <- ncol(x)
foo <- matrix(0,n,n)
for (i in 1:n)
{
for (j in 1:n)
{
foo[i,j] <- fun(x[,i],x[,j])
}
}
return(foo)
}
या Rcpp के साथ एक समारोह:
library("Rcpp")
library("inline")
src <-
'
NumericMatrix x(xR);
Function f(fun);
NumericMatrix y(x.ncol(),x.ncol());
for (int i = 0; i < x.ncol(); i++)
{
for (int j = 0; j < x.ncol(); j++)
{
y(i,j) = as<double>(f(wrap(x(_,i)),wrap(x(_,j))));
}
}
return wrap(y);
'
Papply2 <- cxxfunction(signature(xR="numeric",fun="function"),src,plugin="Rcpp")
लेकिन दोनों काफी हैं मैं आर (एक सममित परिणाम के रूप में ऊपर संभालने द्वारा आधे में समय काटने के साथ परेशान कर रहा नहीं) में इस के लिए एक समारोह में लिख सकते हैं यहां तक कि 100 चर का एक बहुत छोटा सा डेटासेट पर धीमी गति से (मैंने सोचा था कि Rcpp समारोह तेजी से होगा, लेकिन मैं आर और सी के बीच रूपांतरण लगता ++ हर समय अपने टोल लेता है):
> system.time(Papply(matrix(rnorm(100*300),300,100),function(x,y)cor.test(x,y)$p.value))
user system elapsed
3.73 0.00 3.73
> system.time(Papply2(matrix(rnorm(100*300),300,100),function(x,y)cor.test(x,y)$p.value))
user system elapsed
3.71 0.02 3.75
तो मेरे सवाल है:
- इन कार्यों की सादगी के कारण मुझे लगता है यह पहले से ही आर में कहीं है वहाँ एक को लागू करने या
plyr
समारोह है कि यह करता है? मैंने इसकी तलाश की है लेकिन इसे ढूंढने में सक्षम नहीं है। - यदि हां, तो क्या यह तेज़ है?
अच्छा है, धन्यवाद! सहसंबंध पी मान सिर्फ एक उदाहरण था जो आज मैं दौड़ने के लिए हुआ था। –