У меня есть функция, которая принимает два вектора и вычисляет числовое значение (например, cor
correlation). Однако у меня есть два набора данных примерно с 6000 столбцами (два набора данных имеют одинаковые размеры), где функция должна возвращать один вектор со значениями корреляции.
Код с циклом будет выглядеть так:
set.seed(123)
m=matrix(rnorm(9),ncol=3)
n=matrix(rnorm(9,10),ncol=3)
colNumber=dim(m)[2]
ReturnData=rep(NA,colNumber)
for (i in 1:colNumber){
ReturnData[i]=cor(m[,i],n[,i])
}
Это работает нормально, но из соображений эффективности я хочу использовать семейство apply, очевидно, функцию mapply.
Однако mapply(cor,m,n)
возвращает вектор длиной 9 NA
s, откуда он должен возвращать:
> ReturnData
[1] 0.1247039 -0.9641188 0.5081204
РЕДАКТИРОВАНИЕ / РЕШЕНИЕ
Решение, данное @akrun, заключалось в использовании фреймов данных вместо матриц.
Кроме того, тест скорости между двумя предложенными решениями показал, что mapply
-версия быстрее, чем sapply
:
require(rbenchmark)
set.seed(123)
#initiate the two dataframes for the comparison
m=data.frame(matrix(rnorm(10^6),ncol=100))
n=data.frame(matrix(rnorm(10^6),ncol=100))
#indx is needed for the sapply function to get the column numbers
indx=seq_len(ncol(m))
benchmark(s1=mapply(cor, m,n), s2=sapply(indx, function(i) cor(m[,i], n[,i])), order="elapsed", replications=100)
#test replications elapsed relative user.self sys.self user.child sys.child
#2 s2 100 4.16 1.000 4.15 0 NA NA
#1 s1 100 4.33 1.041 4.32 0 NA NA