R 中分类矩阵的排名系统

Ranking System for a Categorical Matrix in R

我有一个数据框,其中的列列出了 child 最喜欢的 5 种动物。我想计算每只动物的频率并对整个数据集中动物的平均位置进行排名。

每列中的数据按升序排序(见下面的数据)(例如 Var 1:Dog 的排名为 1,Roach 的排名为 5)。 Dog 的平均排名为 (1+2+3)/3 = 2,整个数据集中的频率为 3。对于Cat,平均排名为(2+1+2)/3 = 1.67,频率为3。对于Roach,平均排名为4,其频率为3.

 Var1 <- c('Dog','Cat','Chicken','Bird','Roach')
 Var2 <- c('Cat','Dog','Roach','Turtle','Bird')
 Var3 <- c('Bird','Cat','Dog','Roach','Zebra')

 animal.data <- data.frame(Var1, Var2, Var3)
 print(animal.data)

我不确定实现它的最有效方法是什么。我的完整数据集有 500 多列。谢谢。

一种base R方法,

animals <- unique(unlist(animal.data))
out <- list()   
for(i in animals) {     
    x <- which(animal.data == i, arr.ind = TRUE)
    avg <- round(mean(x[,1]),2)
    freq <- nrow(x)
    out[[i]] <- data.frame(Mean=avg,Freq=freq)

} 


do.call(rbind,out)

给予,

        Mean Freq
Dog     2.00    3
Cat     1.67    3
Chicken 3.00    1
Bird    3.33    3
Roach   4.00    3
Turtle  4.00    1
Zebra   5.00    1

数据:

 Var1 <- c('Dog','Cat','Chicken','Bird','Roach')
 Var2 <- c('Cat','Dog','Roach','Turtle','Bird')
 Var3 <- c('Bird','Cat','Dog','Roach','Zebra')

 animal.data <- data.frame(Var1, Var2, Var3,stringsAsFactors=FALSE)