You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何删除列表内数据框C为PTA且D为NA的行

问题描述

我有一个名为my.list的列表,结构如下:

> my.list
$S1
       A   B   C         D
1 101027  NA  C1        NA
2 101031 1.5 PTA 0.8666667
3 101032 1.4  C1 0.5571429
4 101127  NA PTA        NA
5 101220 9.3  C1 0.7849462

$S2
       A    B   C         D
1 102142   NA  C1        NA
2 102143 0.70 PTA 1.7142857
3 102144   NA  C1 2.7257000
4 102148 0.45 PTA        NA
5 102151 0.91  C1 0.7032967
6 102152 0.78 PTA        NA

需要删除*同时满足D列为NA、且C列取值为'PTA'*的行;若C列取值为'C1',即便D列为NA也需保留。
期望得到的输出结果如下:

> my.list
$S1
       A   B   C         D
1 101027  NA  C1        NA
2 101031 1.5 PTA 0.8666667
3 101032 1.4  C1 0.5571429
4 101220 9.3  C1 0.7849462

$S2
       A    B   C         D
1 102142   NA  C1        NA
2 102143 0.70 PTA 1.7142857
3 102144   NA  C1 2.7257000
4 102151 0.91  C1 0.7032967

可复现数据集构造代码如下:

my.list <- structure(list(S1 = structure(list(A = c(101027L, 101031L, 101032L, 
101127L, 101220L), B = c(NA, 1.5, 1.4, NA, 9.3), C = c("C1", "PTA", "C1", "PTA", "C1", "PTA"), D = c(NA, 0.8666667, 0.5571429, NA, 0.7849462
)), .Names = c("A", "B", "C", "D"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5")), S2 = structure(list(A = c(102142L, 102143L, 
102144L, 102148L, 102151L, 102152L), B = c(NA, 0.7, NA, 0.45, 
0.91, 0.78), C = c("C1", "PTA", "C1", "PTA", "C1", "PTA"), D = c(NA, 
1.7142857, 2.7257, NA, 0.7032967, NA)), .Names = c("A", "B", "C", 
"D"), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6"))), .Names = c("S1", "S2"))
实现方案

直接用lapply遍历列表内的所有数据框,按行过滤即可,核心逻辑是保留所有*不满足「C列值为PTA且D列为NA」*的行:

my.list <- lapply(my.list, function(df) {
  df[!(df$C == "PTA" & is.na(df$D)), ]
})

注意:R中判断空值必须使用is.na()函数,不能直接写df$D == NA,该写法返回的结果全为NA,无法完成正确的逻辑判断。

运行上述代码后得到的结果和预期输出完全一致。

内容的提问来源于stack exchange,提问作者sabc04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:01:04