R在多维列联表中获得与最大值相关的级别

时间:2018-10-12 07:52:07

标签: r contingency

带有一个简单的向量,例如

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的水平?

我知道我可以将表转换为数据框,并找到频率列最高的行,但是鉴于数据集中的维数和级别数,将数据转换为数据框将不适合我的RAM内存。

编辑:因此,在第二种情况下,我的预期输出为c, d, j,如下所示:

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

但是请注意,由于RAM问题,我无法对数据使用data.frame调用。

1 个答案:

答案 0 :(得分:1)

您可以将whicharr.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"