由于 NA 行悄悄进入,问题过滤数据框

Issues filtering dataframe since NA rows creep in

我正在尝试在整个数据帧上使用逻辑运算符来过滤数据帧,但 NA 行以某种方式在子集数据帧中蔓延。我已经完成 Subsetting R data frame results in mysterious NA rows and Subsetting R data frame results in mysterious NA rows 但我无法找到或无法找到解决方案。

df <- data.frame(number1 = c(1:5,-13,-2,-34,24,33), number2 = c(10:3, -73, -82))
df
df[df>=0 & !is.na(df$number2),]

我正在尝试进行过滤,以便在我的原始数据框中的任何行中都没有负值。我最终得到 18 行 df 和多个 NA 行。

我尝试在我的 df 上使用 sapply 来检查逻辑操作是否正常。但是如果我用 "which" 换行,我会得到所有 18 行。

sapply(names(df), function(x) df[x]>=0)

我的目标是获得一个在任何列中都没有负值的 df。

编辑:在我的例子中,在我过滤它们之前,我不知道结果 df 会有多少列。因此,使用 & 运算符在列上单独过滤是不可能的。这正是我尝试应用逻辑运算符或整个 df

的原因

问题是您正在尝试对行进行过滤,这意味着您应该向选择器传递一个一维逻辑向量,而不是传递一个二维逻辑矩阵。使用此矩阵作为选择器意味着行不一定会被过滤,值只会被删除。

如果您执行以下操作,它将删除所有具有负值的行,而不会产生任何 NA

df <- data.frame(number1 = c(1:5,-13,-2,-34,24,33), number2 = c(10:3, -73, -82))
df
df[df[,1]>=0 & df[,2]>=0,]

其中 df[,1]>=0 & df[,2]>=0 returns 两列均为正的行的一维逻辑向量。

尝试以下操作。在您想要的条件之间使用 AND

> df[df$number1>0 & df$number2>0,]
  number1 number2
1       1      10
2       2       9
3       3       8
4       4       7
5       5       6

首先认为您需要将矩阵缩减为单个向量。如果您想将其推广到任意数量的列,您可以执行以下任一操作

df[Reduce(`&`, lapply(df, `>=`, 0)), ]
#   number1 number2
# 1       1      10
# 2       2       9
# 3       3       8
# 4       4       7
# 5       5       6

df[rowSums(df >= 0) == ncol(df), ]
#   number1 number2
# 1       1      10
# 2       2       9
# 3       3       8
# 4       4       7
# 5       5       6