由于 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
我正在尝试在整个数据帧上使用逻辑运算符来过滤数据帧,但 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