如何提取列表对象名称并以其值为行号填入数据框?
解决方法
你可以用以下几种高效的方式实现需求,避免unlist()自动添加名称后缀的问题:
方法1:用rep()生成对应长度的ID名称
利用rep()将每个列表元素的名称重复对应次数,再与展开的行号匹配赋值:
d$id[unlist(lst)] <- rep(names(lst), sapply(lst, length))
sapply(lst, length)获取每个列表元素包含的行号数量rep(names(lst), ...)将每个ID名称重复对应次数,确保和unlist(lst)的每行位置一一匹配
方法2:用stack()转换列表为数据框
stack()函数可以直接将列表转为包含行号(values列)和对应ID(ind列)的数据框,再批量赋值:
stacked <- stack(lst) d$id[stacked$values] <- stacked$ind
方法3:用purrr包的imap遍历赋值
如果你习惯tidyverse风格,可以用imap逐个遍历列表的元素值和名称,直接赋值到对应行:
library(purrr) imap(lst, ~ d$id[.x] <<- .y)
.x代表列表中的行号向量,.y代表对应的ID名称<<-用于修改全局环境中的数据框d,如果在函数内操作可根据环境调整
为什么原方法会出错?
unlist(lst)默认会给展开后的元素名称添加后缀(比如原列表的"1"元素展开后名称变为"1.1"、"1.2"),导致你赋值的是带后缀的字符串,而非原始的ID名称。
内容的提问来源于stack exchange,提问作者goctlr
相关产品推荐
相关产品推荐

