排名函数对R中的多个变量进行排名

时间:2014-09-13 17:29:28

标签: r

我正在尝试对数据中的多个数字变量(大约700多个变量)进行排名,并且我不确定如何做到这一点,因为我仍然是使用R的新手。

我不想覆盖同一变量中的排名值,因此需要为每个这些数值变量创建一个新的排名变量。

通过阅读帖子,我相信分配和转换功能以及排名可能能够解决这个问题。我尝试实现如下(示例数据和代码),并努力让它工作。

除了变量xcount,xvisit,ysales之外,还需要填充输出数据集 使用变量xcount_rank,xvisit_rank,ysales_rank包含排名值。

input <- read.table(header=F, text="101 2 5 6 
                102 3 4 7 
                103 9 12 15")
colnames(input) <- c("id","xcount","xvisit","ysales")

input1 <- input[,2:4] #need to rank the numeric variables besides id

for (i in 1:3) 
{
  transform(input1, 
            assign(paste(input1[,i],"rank",sep="_")) = 
              FUN = rank(-input1[,i], ties.method = "first"))
}






input[paste(names(input)[2:4], "rank", sep = "_")] <- 
     lapply(input[2:4], cut, breaks = 10)

这种方法的问题在于它将等级值创建为(101,230],(230,450)等,而我希望看到等级变量中的值被填充为1,2等等。根据我所做的分割,有10个类别。有没有办法实现这个目标?输入[5:7]&lt; - lapply(输入[5:7],rank,ties.method =“first”)

我从下面提供的解决方案中尝试的方法是:

   input <- read.table(header=F, text="101 20 5 6 
                102 2 4 7 
                103 9 12 15
                104 100 8 7 
                105 450 12 65 
                109 25 28 145
                112 854 56 93")
   colnames(input) <- c("id","xcount","xvisit","ysales")

   input[paste(names(input)[2:4], "rank", sep = "_")] <- 
           lapply(input[2:4], cut, breaks = 3)

   Current output I get is:
   id xcount xvisit ysales xcount_rank xvisit_rank ysales_rank
    1 101     20      5      6  (1.15,286] (3.95,21.3] (5.86,52.3]
    2 102      2      4      7  (1.15,286] (3.95,21.3] (5.86,52.3]
    3 103      9     12     15  (1.15,286] (3.95,21.3] (5.86,52.3]
    4 104    100      8      7  (1.15,286] (3.95,21.3] (5.86,52.3]
    5 105    450     12     65   (286,570] (3.95,21.3] (52.3,98.7]
    6 109     25     28    145  (1.15,286] (21.3,38.7]  (98.7,145]
    7 112    854     56     93   (570,855] (38.7,56.1] (52.3,98.7]

    Desired output:
     id xcount xvisit ysales xcount_rank xvisit_rank ysales_rank
     1 101     20      5      6  1           1           1
     2 102      2      4      7  1           1           1
     3 103      9     12     15  1           1           1
     4 104    100      8      7  1           1           1
     5 105    450     12     65  2           1           2
     6 109     25     28    145  1           2           3

如果我尝试对间隔值进行排名,我们希望看到他们会陷入群组中的记录。

1 个答案:

答案 0 :(得分:1)

使用dplyr

 library(dplyr)
  nm1 <- paste("rank", names(input)[2:4], sep="_")
  input[nm1] <-  mutate_each(input[2:4],funs(rank(., ties.method="first")))
  input
  #   id xcount xvisit ysales rank_xcount rank_xvisit rank_ysales
  #1 101      2      5      6           1           2           1
  #2 102      3      4      7           2           1           2
  #3 103      9     12     15           3           3           3

更新

基于new输入并使用cut

  input[nm1] <- mutate_each(input[2:4], funs(cut(., breaks=3, labels=FALSE)))
  input
  #   id xcount xvisit ysales rank_xcount rank_xvisit rank_ysales
  #1 101     20      5      6           1           1           1
  #2 102      2      4      7           1           1           1
  #3 103      9     12     15           1           1           1
  #4 104    100      8      7           1           1           1
  #5 105    450     12     65           2           1           2
  #6 109     25     28    145           1           2           3
  #7 112    854     56     93           3           3           2