Ésta es otra manera de hacerlo:
# split the data by group then apply spearman correlation
# to each element of that list
j <- lapply(split(df, df$group), function(x){cor(x[,2], x[,3], method = "spearman")})
# Bring it together
data.frame(group = names(j), corr = unlist(j), row.names = NULL)
Comparando mi método, el método de Josh, y la solución plyr usando rbenchmark:
Dason <- function(){
# split the data by group then apply spearman correlation
# to each element of that list
j <- lapply(split(df, df$group), function(x){cor(x[,2], x[,3], method = "spearman")})
# Bring it together
data.frame(group = names(j), corr = unlist(j), row.names = NULL)
}
Josh <- function(){
r <- by(df, df$group, FUN = function(X) cor(X$var1, X$var2, method = "spearman"))
data.frame(group = attributes(r)$dimnames[[1]], corr = as.vector(r))
}
plyr <- function(){
ddply(df, .(group), summarise, "corr" = cor(var1, var2, method = "spearman"))
}
library(rbenchmark)
benchmark(Dason(), Josh(), plyr())
que da la salida
> benchmark(Dason(), Josh(), plyr())
test replications elapsed relative user.self sys.self user.child sys.child
1 Dason() 100 0.19 1.000000 0.19 0 NA NA
2 Josh() 100 0.24 1.263158 0.22 0 NA NA
3 plyr() 100 0.51 2.684211 0.52 0 NA NA
Parece que mi método es un poco más rápido pero no mucho. Creo que el método de Josh es un poco más intuitivo. La solución plyr es la más fácil de codificar pero no es la más rápida (¡pero seguro que es mucho más conveniente)!
Gracias Josh por la pronta respuesta. ¡Todos trabajaron! ;-) – user1009166
(+1) Buena respuesta. ¿Qué pasa con 'r <- by (df, df $ group, FUN = function (X) cor (df [, - 1], method =" spearman "))'? – MYaseen208
@ MYaseen208. Gracias. El código que das devuelve algo ligeramente diferente. No sé su nombre, pero es como una matriz de varianza-covarianza, excepto con una correlación en cada celda. El código que utilicé devuelve, en cambio, una correlación escalar única para cada grupo. –