несовместимые размеры при использовании lapply(cor(x, 1:length(x))

У меня есть кадр данных следующим образом:

a <- c(1,45,5,23,78,NA,NA)
b <- c(1,4,5,NA,NA,NA,NA)
c <- c(4,NA,NA,NA,NA,NA,NA)
d <- c(4,6,7,3,4,23,4)

df <- data.frame(a,b,c,d)

Теперь я хотел бы получить вектор с коэффициентами корреляции каждого вектора с собственной длиной без NA.

Например: cor(df$a[!is.na(df$a)], 1:length(df$a[!is.na(df$a)])), который возвращает мне коэффициент линейной корреляции (1,45,5,23,78) с (1,2,3,4,5)

Когда я применяю написанный выше код к одному столбцу, он работает. Однако, когда я включаю функцию в функцию lapply, чтобы получить ее для всех столбцов, я получаю сообщение об ошибке «несовместимые размеры». Я понимаю, что ошибка несовместимых размеров указывает на то, что разные размеры векторов коррелируют. Однако как это возможно, когда я сопоставляю вектор с его длиной...?

result <- lapply(df, function(x){ o <-cor(x[!is.na(x)], 1:length(x[!is.na(x)]))})

Я также попробовал, что также вернуло мне ту же ошибку.

result <- lapply(df, function(x) {o <-cor(c(x[!is.na(x)]),c(1:length(x[!is.na(x)])))})

person GNee    schedule 16.11.2016    source источник
comment
это потому, что cor(4, 1) не определено?   -  person Dirk Nachbar    schedule 16.11.2016
comment
Я не могу воспроизвести вашу ошибку, операторы lapply работают нормально.   -  person Shape    schedule 16.11.2016
comment
У меня тоже хорошо работает, но для столбца c, который дает NA (и это нормально, потому что есть только одно наблюдение). Кстати, вам не нужен o ‹- в вашей функции в вашем ноутбуке)   -  person Bastien    schedule 16.11.2016
comment
Вы уверены, что ваш пример соответствует вашему фактическому data.frame? Возможно ли, что ваш фактический data.frame имеет некоторое количество NaN или NULLS?   -  person Shape    schedule 16.11.2016


Ответы (1)


Вы пробовали:

apply(df, 2, cor, y=1:nrow(df),use="complete.obs")

Это более элегантный способ кодирования вашей функции. Это может работать лучше и для вас.

person Bastien    schedule 16.11.2016
comment
Еще безопаснее sapply(df, cor, y=1:nrow(df),use="complete.obs") - person Pierre L; 16.11.2016