有条件地删除数据框中包含 NA 的行
Conditionally remove of rows in dataframe which includes NA
我的例子 df:
a1 a2 a3 a4
1 1 1 4 6
2 1 2 3 2
3 2 NA 5 NA
4 2 5 6 3
5 3 1 1 2
6 3 3 2 6
"If a4 == 6
then delete this row."
因此,我想删除(仅!)此示例中的第 1 行和第 6 行。
我知道这行得通:
df_1 <- df[-c(1, 6), ]
但我正在寻找更通用的解决方案。
我试过最明显的方法:
attach(df)
df_1 <- df[ which(a4 != 6),]
detach(df)
但是,这也会删除所有 NA
,我想保留它们。
a1 a2 a3 a4
2 1 2 3 2
4 2 5 6 3
5 3 1 1 2
然后我尝试了:
df_1 <-df[!(df$a4 == 6),]
但随后第 3 行跳入边缘,整行变为 NA
a1 a2 a3 a4
2 1 2 3 2
NA NA NA NA NA
4 2 5 6 3
5 3 1 1 2
有什么想法吗?
提前致谢!
我们可以使用带有is.na
的逻辑索引来移除
df[!(df$a4 == 6 & !is.na(df$a4)),]
因为当元素不存在时它将return整个数据集
或者也可以这样写(如@thelatemail评论的)
df[df$a4!=6 | (is.na(df$a4)),]
您可以使用 %in%
而不是 ==
来正确处理 NA
s:
df[!(df$a4 %in% 6),]
# a1 a2 a3 a4
#2 1 2 3 2
#3 2 NA 5 NA
#4 2 5 6 3
#5 3 1 1 2
我的例子 df:
a1 a2 a3 a4
1 1 1 4 6
2 1 2 3 2
3 2 NA 5 NA
4 2 5 6 3
5 3 1 1 2
6 3 3 2 6
"If a4 == 6
then delete this row."
因此,我想删除(仅!)此示例中的第 1 行和第 6 行。
我知道这行得通:
df_1 <- df[-c(1, 6), ]
但我正在寻找更通用的解决方案。
我试过最明显的方法:
attach(df)
df_1 <- df[ which(a4 != 6),]
detach(df)
但是,这也会删除所有 NA
,我想保留它们。
a1 a2 a3 a4
2 1 2 3 2
4 2 5 6 3
5 3 1 1 2
然后我尝试了:
df_1 <-df[!(df$a4 == 6),]
但随后第 3 行跳入边缘,整行变为 NA
a1 a2 a3 a4
2 1 2 3 2
NA NA NA NA NA
4 2 5 6 3
5 3 1 1 2
有什么想法吗? 提前致谢!
我们可以使用带有is.na
的逻辑索引来移除
df[!(df$a4 == 6 & !is.na(df$a4)),]
因为当元素不存在时它将return整个数据集
或者也可以这样写(如@thelatemail评论的)
df[df$a4!=6 | (is.na(df$a4)),]
您可以使用 %in%
而不是 ==
来正确处理 NA
s:
df[!(df$a4 %in% 6),]
# a1 a2 a3 a4
#2 1 2 3 2
#3 2 NA 5 NA
#4 2 5 6 3
#5 3 1 1 2