I try to change row.names of each dataframe in a list by adding their names to rownames.
List is:
l <- list(a=data.frame(col = c(1,2,3),row.names = c("k","l","m")), b=data.frame(col =
c(4,5,6), row.names = c("o","p","r")))
I tried this but couldn't add index names a and b:
lapply(l,function(x) {x %>% `row.names<-` (paste(names(l)[which(l %in%
x)],rownames(x),sep = "."))})
l$a is:
| row.names | col |
|---|---|
| k | 1 |
| l | 2 |
| m | 3 |
But it should be like this:
| row.names | col |
|---|---|
| a.k | 1 |
| a.l | 2 |
| a.m | 3 |
What should I do? Thank you in advance.
CodePudding user response:
An approach using mapply
mapply(function(lis, nm){rownames(lis) <- paste0(nm, ".", rownames(lis))
list(lis)},
dlis, names(dlis))
$a
col
a.k 1
a.l 2
a.m 3
$b
col
b.o 4
b.p 5
b.r 6
Data
dlis <- list(a = structure(list(col = c(1, 2, 3)), class = "data.frame", row.names = c("k",
"l", "m")), b = structure(list(col = c(4, 5, 6)), class = "data.frame", row.names = c("o",
"p", "r")))
CodePudding user response:
Instead of iterating over the list, we can iterate over the name of the list, which can have better control when pasting the names together.
This is modified from your attempt:
setNames(lapply(names(l),
\(x) l[[x]] %>% `row.names<-` (paste(x, rownames(l[[x]]), sep = "."))),
names(l))
$a
col
a.k 1
a.l 2
a.m 3
$b
col
b.o 4
b.p 5
b.r 6
CodePudding user response:
1) rbind Use rbind to create a single data frame with the desired row names and then split it back to the original.
split(do.call("rbind", l), rep(names(l), sapply(l, nrow)))
2) data.frame Use data.frame and its row.names= argument to avoid row.names<-
rnames <- function(x, nm) data.frame(x, row.names = paste0(nm, ".", rownames(x)))
Map(rnames, l, names(l))
3) for Use a for loop creating ll
ll <- l
for(nm in names(ll)) rownames(ll[[nm]]) <- paste0(nm, ".", rownames(ll[[nm]]))
