R数据帧 - 用na进行逻辑测试

时间:2014-07-31 09:05:42

标签: r dataframe logical-operators

我有一个带字段的数据框(SCV)(DELETE_CUSTOMER)。我想删除DELETE_CUSTOMER!=" Y"的数据框中的行。目前,此字段全部为NA - 但这是一个随着时间的推移而增长的数据框,因此将来可能会有Y.

目前我正在尝试以下方法:

DELETIONS <- which(is.na(SCV_DELTA_R$DELETE_CUSTOMER) !=T &
                         SCV_DELTA_R$DELETE_CUSTOMER == "Y")
SCV_DELTA_R <- SCV_DELTA_R[-DELETIONS, ]

这给了我相同的行数,但表中所有字段的所有值都是NA

DELETIONS列表不包含任何内容,其名称为:

integer(0)

因此,它不会删除任何内容,而是删除所有数据。

2 个答案:

答案 0 :(得分:0)

表达式

which(is.na(SCV_DELTA_R$DELETE_CUSTOMER)!=T & SCV_DELTA_R$DELETE_CUSTOMER=="Y")

返回一个空结果,因为你说你的data.frame中没有任何“Y”:表达式选择值等于“Y”的行(这也意味着它不是“NA”,因此,包含表达式的第一部分也没有用。)

由于您没有任何“Y”,表达式返回空,因此DELETIONS为空,并且调用SCV_DELTA_R[-DELETIONS,]完全清除您的表。

如果您要删除值为“Y”的所有行 NA我建议:

DELETIONS=which(is.na(SCV_DELTA_R$DELETE_CUSTOMER) | SCV_DELTA_R$DELETE_CUSTOMER=="Y")

如果您只想删除值为“Y”的所有行,我建议:

DELETIONS=which(SCV_DELTA_R$DELETE_CUSTOMER=="Y")

如果你想删除只有NA的所有行我建议:

DELETIONS=which(is.na(SCV_DELTA_R$DELETE_CUSTOMER))

如果你想删除价值不同于“Y”的所有行,我建议(这会清除你的表,因为你说你没有任何“Y”):

DELETIONS=which(SCV_DELTA_R$DELETE_CUSTOMER!="Y")

我希望这对你有所帮助。

答案 1 :(得分:0)

您可以翻转逻辑以选择要保留的内容,即任何不是"Y"的条目

SELECTIONS <- !SCV_DELTA_R$DELETE_CUSTOMER %in% "Y"

SCV_DELTA_R <- SCV_DELTA_R[SELECTIONS, ]

因此NA

中应包含SELECTED的值