如何移除列表内所有DataFrame中包含-9999值的行?
移除列表中DataFrame含-9999的行
基础R实现
直接用lapply遍历列表,结合行级筛选即可实现需求:
# 处理列表L,生成目标列表R R <- lapply(L, function(df) { # 筛选出所有未包含-9999的行 df[!apply(df == -9999, 1, any), ] })
代码解释
lapply(L, function(df) {...}):遍历列表L中的每个DataFrame,对每个df执行筛选逻辑df == -9999:生成与原DataFrame同维度的逻辑矩阵,标记所有值为-9999的位置apply(df == -9999, 1, any):按行检查,只要该行存在-9999就返回TRUE!:对上述结果取反,得到所有无-9999的行的逻辑索引df[逻辑索引, ]:提取符合条件的行,生成清理后的DataFrame
tidyverse实现(更简洁的语法)
如果习惯使用tidyverse工具链,用purrr+dplyr可以写出更易读的代码:
library(tidyverse) R <- map(L, ~ filter(.x, if_all(everything(), ~ .x != -9999)))
代码解释
map(L, ...):替代lapply的遍历函数,属于purrr包的核心工具filter(.x, ...):dplyr的行筛选函数,对当前DataFrame(.x)进行行过滤if_all(everything(), ~ .x != -9999):检查所有列(everything()),仅保留所有列都不含-9999的行
验证结果
运行以下代码可确认处理后的列表与示例中的R完全一致:
all.equal(R, list(R1,R2,R3)) # 返回TRUE表示结果匹配
内容的提问来源于stack exchange,提问作者Natalia
相关产品推荐
相关产品推荐

