Reputation: 1079
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
Upvotes: 5
Views: 10387
Reputation: 18437
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])
Upvotes: 15
Reputation: 60924
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)
})
Upvotes: 14