R получить уровни, связанные с максимальным значением в многомерной таблице сопряженности - PullRequest
0 голосов
/ 12 октября 2018

С простым вектором, таким как

x <- sample(letters[1:3], size=20, replace=T)

Я бы выделил наиболее часто встречающееся письмо с чем-то вроде

y <- table(x)
print(names(y)[y==max(y)])
"b"

Однако, использование той же техники для многомерного фрейма данных не работает:

set.seed(5)
x <- data.frame(c1=sample(letters[1:3], size=30, replace=T),
                c2=sample(letters[4:5], size=30, replace=T),
                c3=sample(letters[6:10], size=30, replace=T))
y <- table(x)

print(names(y)[y==max(y)])
NULL

Как извлечь уровни c1, c2 и c3, которые имеют наибольшее значение в таблице сопряженности?

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

Редактировать: Итакмой ожидаемый результат во втором случае будет c, d, j, например:

z <- data.frame(y)
z[z$Freq==max(z$Freq), 1:3]
   c1 c2 c3
27  c  d  j

Но учтите, что я не могу использовать вызов data.frame для своих данных из-за проблем с оперативной памятью.

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете использовать which с arr.ind = TRUE:

mapply("[", 
       dimnames(y), 
       as.data.frame(which(y == max(y), arr.ind = TRUE)))
# c1  c2  c3 
#"c" "d" "j"

mapply("[", 
       dimnames(y), 
       as.data.frame(which(y == min(y), arr.ind = TRUE)))
#      c1  c2  c3 
# [1,] "a" "d" "f"
# [2,] "b" "d" "g"
# [3,] "c" "d" "g"
# [4,] "b" "e" "g"
# [5,] "a" "d" "h"
# [6,] "b" "d" "h"
# [7,] "c" "d" "h"
# [8,] "c" "e" "h"
# [9,] "a" "e" "i"
#[10,] "b" "e" "i"
#[11,] "c" "e" "i"
...