在R中:如何在数据帧列表中对每个单独的数据帧进行排名?

时间:2014-02-01 05:36:14

标签: r

我在概念上简化了我的问题,如下所示。我有一个由两个数据帧组成的列表(mylist)。我知道如何使用lapply重新排序它们(例如,在第4和第1个变量上):

mylist<-lapply(mylist, function(x) x[order(x[,4],x[,1]),])

现在我尝试使用lapply()和rank()为列表中的每个数据帧添加第5列,并使用等级填充列(该数据帧中的等级,在第4个变量上)。< / p>

我尝试了几十种这种排列

mylist[,5]<-lapply(mylist, function(x) rank(x[,4], ties.method="first")) 

一切正常。救命!感谢

> mylist
[[1]]
a b c d
1 1 4 7 A
2 2 5 8 A
3 3 6 9 B

[[2]]
a b c d
1 9 6 3 A
2 8 5 2 A
3 7 4 1 B

3 个答案:

答案 0 :(得分:2)

好吧不可能:

  mylist[,5]<-lapply(mylist, function(x) rank(x[,4], ties.method="first")) 

...因为mylist[,5]没有任何意义。 mylist你说的是一个两元素列表,所以它甚至没有列。因此,您需要遍历元素并将列添加到它们中:

 mylist <-lapply(mylist, function(x) { rl <- rank( x[,4], ties.method="first")
                                      x <- cbind( x, rl=rl) 
                                      x [ order(x['rl']) , ] } )

答案 1 :(得分:0)

您的lapply会返回rank的输出,这是一个向量。您需要为每个data.frame添加一列,然后返回data.frame

mylist <- list(data.frame(a = rnorm(5), b = rpois(5, 3)), data.frame(a = rnorm(5), b = rpois(5, 3)) )
mylist
## [[1]]
##             a b
## 1 -1.31730854 4
## 2  0.04395243 1
## 3  0.15370905 0
## 4 -0.77556501 4
## 5  1.12879380 4
## 
## [[2]]
##             a b
## 1 -0.96314478 3
## 2 -0.54824004 6
## 3  0.34943917 1
## 4 -0.07077913 0
## 5  1.10519356 3

lapply(mylist, function(x) { x$c <- rank(x$b); x })
## [[1]]
##             a b c
## 1 -1.31730854 4 4
## 2  0.04395243 1 2
## 3  0.15370905 0 1
## 4 -0.77556501 4 4
## 5  1.12879380 4 4
## 
## [[2]]
##             a b   c
## 1 -0.96314478 3 3.5
## 2 -0.54824004 6 5.0
## 3  0.34943917 1 2.0
## 4 -0.07077913 0 1.0
## 5  1.10519356 3 3.5

答案 2 :(得分:0)

使用@JakeBurkhead提供的数据,您只需使用transform

即可
set.seed(123)
mylist <- list(data.frame(a = rnorm(5), b = rpois(5, 3)),
               data.frame(a = rnorm(5), b = rpois(5, 3)) )
lapply(mylist, transform, c = rank(b, ties.method = "first"))
## [[1]]
##           a b c
## 1 -0.560476 6 5
## 2 -0.230177 3 2
## 3  1.558708 4 4
## 4  0.070508 3 3
## 5  0.129288 1 1

## [[2]]
##          a b c
## 1  1.28055 4 5
## 2 -1.72727 3 3
## 3  1.69018 3 4
## 4  0.50381 2 2
## 5  2.52834 1 1