排名数据框

时间:2015-04-20 18:34:32

标签: r

她是我的数据:

x<- data.frame(P=c("M","C","M","C","C","M","C","M"),
    Q=c(13,12,12,14,19,15,12,11),
    R=c(15,13,21,32,32,21,13,32),
    T=c(15,12,12,14,12,11,19,15))

我想计算每个类别中变量的均值。 例如,Q的平均值为:M =(13 + 12 + 15 + 11)= 12.75,C =(12 + 14 + 19 + 12)= 14.25,等等。

接下来,我想对每个变量的均值进行排名,并获得下表:

P   Q   R   T
M   2   2   2
C   1   1   1

我想为我的真实数据获得相同的排名。 例如。如果我有三个12,所有人都会得到相同的等级

3 个答案:

答案 0 :(得分:2)

你可以尝试

aggregate(.~P, x, mean)

或者

library(dplyr)
x1 <-   x %>%
          group_by(P) %>%
           summarise_each(funs(mean)) 
x1
# P     Q     R     T
#1 C 14.25 22.50 14.25
#2 M 12.75 22.25 13.25

排名

x1 %>%
    mutate_each(funs(rank(-.)), Q:T)
#  P Q R T
#1 C 1 1 1
#2 M 2 2 2

更新

假设有关系,

 x1$Q[2] <- x1$Q[1]
默认情况下,

rank会获得平均关系。您可以指定ties.methodmin或使用min_rank

  x1 %>% 
     mutate_each(funs(min_rank(-.)), Q:T)
  #  P Q R T
  #1 C 1 1 1
  #2 M 1 2 2

答案 1 :(得分:2)

为了完整起见,可以使用devel version on GitHub

data.table的{​​{1}}解决方案

手段

frank

对于排名

library(data.table) ## v >= 1.9.5
(Res <- setDT(x)[, lapply(.SD, mean), by = P])
#    P     Q     R     T
# 1: M 12.75 22.25 13.25
# 2: C 14.25 22.50 14.25

答案 2 :(得分:1)

获得你可以做到的意思

do.call(rbind,lapply(split(x, f = x$P), function(x) data.frame(P = unique(x$P), Q = mean(x$Q), R = mean(x$R), T = mean(x$T))))