如何在R语言中为列表内数据框的行名添加对应列表名称
解决列表中DataFrame行名添加对应列表名称的问题
你的代码问题出在which(l %in% x)无法正确获取当前元素的列表名称——列表里的每个DataFrame是独立对象,%in%的匹配逻辑在这里不生效,而且默认的lapply只传递元素本身,没把对应名称传进去。以下是两种可行的解决方法:
方法一:基础R实现
直接遍历列表的名称,针对每个名称对应的DataFrame修改行名:
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"))) lapply(names(l), function(nm) { df <- l[[nm]] rownames(df) <- paste(nm, rownames(df), sep = ".") df }) %>% setNames(names(l))
方法二:tidyverse(purrr)实现
用purrr::imap函数,它会自动同时传递列表元素和对应的名称,代码更简洁:
library(purrr) library(dplyr) 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"))) imap(l, function(df, nm) { df %>% `row.names<-`(paste(nm, rownames(df), sep = ".")) })
两种方法执行后,l$a的行名都会变成a.k、a.l、a.m,l$b的行名变成b.o、b.p、b.r,符合你的需求。
内容的提问来源于stack exchange,提问作者python_programmer
相关产品推荐
相关产品推荐

