Кроме того, имеется еще одна опция синтаксиса; один из которых приводит к скалярному значению для корреляции, за исключением, в отличие от двух вышеперечисленных случаев, он сохраняет класс matrix
. Это доступ к столбцам с использованием x[1]
& x[2]
, так как одиночные скобки (без запятой) дают один столбец data.frame
.
Для ваших целей, любой из 3-х методов, отмеченных непосредственно выше, должны быть приемлемы - до тех пор, как вы проходите cor
два объекты, являются ли они (атомные) числовые векторы (случай [, ]
и случай [[ ]]
) или одного столбцов data.frame
s (случай [ ]
) - функция будет оцениваться как cor(x, y, ...)
и возвращает единую корреляцию значение. Тонкая разница между первыми двумя методами и третьим методом - это класс возвращаемого значения - numeric
(атомный) для первого и matrix
для последнего - но это, скорее всего, несущественная деталь в большой картине.
Позвольте мне подвести итог это с несколькими примерами, используя эти данные:
set.seed(123)
df3 <- data.frame(
A=rnorm(10),
B=rnorm(10))
##
set.seed(321)
df4 <- data.frame(
A=rnorm(10),
B=rnorm(10))
##
dflist <- list(df3,df4)
типа A. Результат является корреляционная матрица; Результат класса matrix
:
R> class(cor(df3)); cor(df3)
[1] "matrix"
A B
A 1.0000000 0.5776151
B 0.5776151 1.0000000
В. Тип результата является одно значение корреляции; класс результатов: matrix
:
R> class(cor(df3[1],df3[2])); cor(df3[1],df3[2])
[1] "matrix"
B
A 0.5776151
C.Тип результата - это одно значение корреляции; Результат класса numeric
:
R> class(cor(df3[,1],df3[,2])); cor(df3[,1],df3[,2])
[1] "numeric"
[1] 0.5776151
Д. Тип результата является одно значение корреляции; Результат класс numeric
:
R> class(cor(df3[[1]],df3[[2]])); cor(df3[[1]],df3[[2]])
[1] "numeric"
[1] 0.5776151
Подобным же образом, следующие четыре функции fA
- fD
соответствуют случаям A
- D
, описанных выше:
fA <- function(y) {
res <- lapply(y,cor)
message(paste0("Element class: ",class(res[[1]])))
res
}
##
fB <- function(y) {
res <- lapply(y, function(x) {
cor(x[1],x[2])
})
message(paste0("Element class: ",class(res[[1]])))
res
}
##
fC <- function(y) {
res <- lapply(y, function(x) {
cor(x[,1],x[,2])
})
message(paste0("Element class: ",class(res[[1]])))
res
}
##
fD <- function(y) {
res <- lapply(y, function(x) {
cor(x[[1]],x[[2]])
})
message(paste0("Element class: ",class(res[[1]])))
res
}
И запуская их на объекте dflist
дает нам
R> fA(dflist)
Element class: matrix
[[1]]
A B
A 1.0000000 0.5776151
B 0.5776151 1.0000000
[[2]]
A B
A 1.0000000 -0.1816951
B -0.1816951 1.0000000
##
R> fB(dflist)
Element class: matrix
[[1]]
B
A 0.5776151
[[2]]
B
A -0.1816951
##
R> fC(dflist)
Element class: numeric
[[1]]
[1] 0.5776151
[[2]]
[1] -0.1816951
##
R> fD(dflist)
Element class: numeric
[[1]]
[1] 0.5776151
[[2]]
[1] -0.1816951
Попробуйте 'lapply (ddata, function (x) { cor (x [[1]], x [[2]]) })' – nrussell
Привет, Спасибо, что ваше решение сработало, но у меня есть сомнения. Когда я ссылаюсь на x [[1]] в функции, он ссылается на весь фрейм данных справа .. Тогда как он выполняет cor между отдельными столбцами кадра данных? –
Я добавил ответ ниже, чтобы подробно рассказать о моем комментарии. – nrussell