我在概念上简化了我的问题,如下所示。我有一个由两个数据帧组成的列表(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
答案 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