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
相关产品推荐
相关产品推荐

