保留嵌套列表中的data.frame对象并合并时遇问题求助
解决列表移除character元素后合并的问题
嘿,我来帮你排查下为什么你的代码会得到空列表,以及怎么正确实现需求~
首先,你的目标是移除列表lst2中类型为character的元素,然后合并剩余的data.frame。原来的代码用sapply(lst2, is.data.frame)来筛选,但得到空的is_df,大概率是因为列表里的data.frame元素没有被正确识别,或者列表里本来就没有符合is.data.frame判断的元素。
第一步:先确认列表元素的类型
先跑这段代码看看每个元素的类型,搞清楚问题出在哪:
# 查看每个元素的类 sapply(lst2, class) # 或者更直观的,查看每个元素的类型和结构 lapply(lst2, str)
第二步:正确筛选掉character类型的元素
如果你的列表里确实有data.frame,只是之前的筛选条件不对,试试这两种方式来过滤:
方式1:直接移除character类型元素
# 用Filter函数筛选非character元素 lst2_filtered <- Filter(function(x) !is.character(x), lst2) # 或者用base R的逻辑索引 lst2_filtered <- lst2[!sapply(lst2, is.character)]
方式2:更稳妥的——只保留data.frame元素
如果你最终只需要合并data.frame,不管其他非character类型的元素(比如NULL、普通list),直接筛选data.frame更靠谱:
# 筛选所有data.frame类型的元素 lst2_filtered <- lst2[sapply(lst2, is.data.frame)] # 或者用purrr包的keep函数(更简洁) library(purrr) lst2_filtered <- keep(lst2, is.data.frame)
第三步:合并筛选后的列表
接下来用rbindlist(推荐,来自data.table包,速度更快)或者rbind.fill合并:
用data.table的rbindlist(推荐)
library(data.table) finaldf <- rbindlist(lst2_filtered, fill = TRUE) # fill=TRUE会自动补全缺失的列
用plyr的rbind.fill
library(plyr) finaldf <- rbind.fill(lst2_filtered)
这样应该就能得到你想要的合并后的data.frame啦~
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

