R применяет странное поведение с NA

У меня есть корреляционная матрица между двумя наборами переменных. Я хочу найти переменную B, которая имеет максимальную корреляцию с каждым из As

> B = data.frame('B1' = c(3,3,5), 'B2' = c(2,7,8))
> A = data.frame('A1' = c(1,2,3), 'A2' = c(4,2,6))
> corr_matrix = cor(A,B)
> corr_matrix

          B1        B2
A1 0.8660254 0.9332565
A2 0.8660254 0.1555428

я бегу

> temp = apply(corr_matrix,1,which.max)
> temp
A1 A2 
2  1
> names(B)[temp]
[1] "B2" "B1"

И получить хороший вектор того, что мне нужно. Вот улов. Если моя матрица выглядит так

corr_matrix

           B1 B2        B3
A1         NA NA        NA
A2  0.3986434 NA 0.2807630
A3 -0.3568664 NA 0.6037172
A4  0.1974342 NA 0.6827092

apply(corr_matrix,1,which.max)

$A1
integer(0)

$A2
B1 
1 

$A3
B3 
3 

$A4
B3 
3 

Я получаю странную вложенную структуру, которую я не особо понимаю. Может кто-нибудь объяснить, что это за структура и почему она отличается от приведенного выше примера?

Я имею в виду, я был бы счастлив, если бы он выплюнул

A1 A2 A3 A4
NA  1  3  3

Наконец, я вижу ответ, который хочу (NA, B1, B3, B3), но как мне получить его в векторной форме?

Я вижу много потоков с применением NA +, но ни один из них, похоже, не работает для моей цели, поэтому я прошу прощения, если это дубликат чего-то, о чем я не знаю.


person hjw    schedule 17.07.2013    source источник


Ответы (2)


Корреляционная матрица:

corr_matrix <- as.matrix(read.table(text = "B1 B2        B3
                          A1         NA NA        NA
                          A2  0.3986434 NA 0.2807630
                          A3 -0.3568664 NA 0.6037172
                          A4  0.1974342 NA 0.6827092", header = TRUE, row.names = 1))

Вы можете определить функцию для обработки случаев, когда все значения равны NA:

temp <- apply(corr_matrix,1, function(x) if (all(is.na(x))) NA else which.max(x))

temp
# A1 A2 A3 A4 
# NA  1  3  3 

names(B)[temp]
# [1] NA   "B1" "B3" "B3"
person Sven Hohenstein    schedule 17.07.2013
comment
Большое спасибо, это действительно полезно. Не могли бы вы также объяснить, что такое странная вложенная структура и как я могу с этим справиться, если снова столкнусь с ней? - person hjw; 17.07.2013
comment
@hjw integer(0) — целочисленный вектор длины 0. Для получения дополнительной информации взгляните на ответ Аруна. - person Sven Hohenstein; 17.07.2013

Решение Свена - это путь в целом. Но в этом случае вы можете уйти, изменив mode вашего выходного списка на numeric:

ll <- structure(list(A1 = integer(0), A2 = structure(1L, .Names = "B1"), 
      A3 = structure(3L, .Names = "B3"), A4 = structure(3L, .Names = "B3")), 
     .Names = c("A1", "A2", "A3", "A4"))

mode(ll) <- "numeric"
ll
# A1 A2 A3 A4 
# NA  1  3  3 
person Arun    schedule 17.07.2013