Reputation: 817
I am trying to use lapply (and want the solution with lapply) to rename columns of a data.frame located in a list, but it's returning names, not the renamed data.frames:
# define list
li <- list(u_n = data.frame(x = 1:3), r_l = data.frame(y = 4:6))
# trying to rename columns after the element of the list they're located in
li_2 <- lapply(1:length(li),
function(x,y) colnames(y[[x]]) <- names(y)[x], y = li)
However, this returns:
[[1]]
[1] "u_n"
[[2]]
[1] "r_l"
If I use the same method as the function specified in lapply individually, it does work:
li[1]
$u_n
x
1 1
2 2
3 3
colnames(li[[1]]) <- names(li)[1]
li[1]
$u_n
u_n
1 1
2 2
3 3
Upvotes: 7
Views: 11390
Reputation: 887851
We may need to return the object after naming it.
li_2 <- lapply(seq_along(li), function(i) {
colnames(li[[i]]) <- names(li)[i]
li[[i]]})
Or this can be done with setNames
li_2 <- lapply(names(li), function(x) setNames(li[[x]], x) )
Or we could use Map
, which is a wrapper for mapply
(that is a multivariate version of sapply
). We apply the FUN
to corresponding elements of each input.
li_2 <- Map(setNames, li, names(li))
Here, we are changing the column names of each list
element with corresponding names of the list
element. If we are using anonymous function, it would be
Map(function(x,y) setNames(x,y), li, names(li))
Upvotes: 11