R

时间:2019-09-16 19:10:38

标签: r ranking categorical-data

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

每列中的数据均按升序排序(请参见下面的数据)(例如,变量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列。谢谢。

1 个答案:

答案 0 :(得分:2)

一种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)