R name colnames and rownames in list of data.frames with lapply

微笑、不失礼 提交于 2019-11-27 22:51:32

问题


I'm pretty frustrated because I dont know how I achieve the naming of the columns and rows in a list of data.frames. I mean I want to avoid using a loop. So I figured I could use just lapply. Ok at first I have the following list:

>a
    $nem.greedyMAP.FALSE.POS
   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1  NA NA NA NA NA NA NA NA NA  NA
2  NA NA NA NA NA NA NA NA NA  NA
3  NA NA NA NA NA NA NA NA NA  NA
4  NA NA NA NA NA NA NA NA NA  NA
5  NA NA NA NA NA NA NA NA NA  NA
6  NA NA NA NA NA NA NA NA NA  NA
7  NA NA NA NA NA NA NA NA NA  NA
8  NA NA NA NA NA NA NA NA NA  NA
9  NA NA NA NA NA NA NA NA NA  NA
10 NA NA NA NA NA NA NA NA NA  NA

$nem.greedyMAP.FALSE.NEG
   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1  NA NA NA NA NA NA NA NA NA  NA
2  NA NA NA NA NA NA NA NA NA  NA
3  NA NA NA NA NA NA NA NA NA  NA
4  NA NA NA NA NA NA NA NA NA  NA
5  NA NA NA NA NA NA NA NA NA  NA
6  NA NA NA NA NA NA NA NA NA  NA
7  NA NA NA NA NA NA NA NA NA  NA
8  NA NA NA NA NA NA NA NA NA  NA
9  NA NA NA NA NA NA NA NA NA  NA
10 NA NA NA NA NA NA NA NA NA  NA

Of course this list is much bigger, otherwise I wouldnt be worth the trouble. However I want to rename the columns and rows for all data.frames the same. So I though I could use:

lapply(a, function(x) {colnames(x) <- paste("col",1:10,sep="")})

But nothing happens. How could I achieve this. Or is lapply the wrong way?

Thanks


回答1:


You need to remember that the object x inside the lapply is not the original object, but a copy. Changing the colnames of the copy does not impact the original object. You need to return x in order to get a new copy of the object that includes the new names.

new_obj = lapply(a, function(x) {
   colnames(x) <- paste("col",1:10,sep="")
   return(x)
  })



回答2:


I'll prefer setNames in this case

set.seed(1)
datalist <- list(dat1 = data.frame(A = 1:10, B = rnorm(10)),
                 dat2 = data.frame(C = 100:109, D = rnorm(10))
                 )
lapply(datalist, names)
##  $dat1
## [1] "A" "B"

## $dat2
## [1] "C" "D"

datalist <- lapply(datalist, setNames, paste0("col", 1:2))
lapply(datalist, names)
## $dat1
## [1] "col1" "col2"

## $dat2
## [1] "col1" "col2"

EDIT

A more general solution to modify rownames and colnames within a list

lapply(datalist, "colnames<-", paste0("col", 1:2))
lapply(datalist, "rownames<-", letters[1:10])


来源:https://stackoverflow.com/questions/17639987/r-name-colnames-and-rownames-in-list-of-data-frames-with-lapply

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!