我在数据集新
中有三个可变类别,状态和审核category status review
max state yes
min state yes
min state yes
max fine yes
NA could state yes
max state yes
NA could state yes
我有两个要处理的条件
条件一
在category = min
和status = state
我使用下面的代码
new1 <- new[!with(new,new$category=="min" &new$status=="state"),]
我得到了以下输出
category status review
max state yes
max fine yes
NA could state yes
max state yes
NA could state yes
条件二:删除包含category = min
和status = could state
new2 <- new1[!with(new1,new1$category=="min" &new1$status=="could state"),]
我期待以下结果
category status review
max state yes
max fine yes
NA could state yes
max state yes
NA could state yes
我得到的输出是
category status review
max state yes
max fine yes
NA NA NA
max state yes
NA NA NA
我不确定为什么记录会被NA取代
是否有其他方法可以在一个条件中同时提供这两个条件(在category = min
和status = state
以及could state
时删除)。我提到了其他可用的问题
答案 0 :(得分:3)
如果列包含NA元素,则逻辑条件将返回该元素的NA,除非使用is.na
进行处理以返回TRUE。在这里,我否定(!
)为'category'中的NA元素返回FALSE。根据OP的两个条件,我们需要在'category'为'min'且'status'为'state'或(|
)其中'category'为'min'和'status'的情况下为TRUE是'可以陈述'。一旦我们得到TRUE值,只需将(!
)否定转换为FALSE,反之亦然。然后,根据该索引('i1')对行进行子集化。
i1 <- !with(new1, (category == "min" & !is.na(category) & status =="state")|
(category =="min" & !is.na(category) & status == "could state"))
new1[i1,]
# category status review
#1 max state yes
#4 max fine yes
#5 <NA> could state yes
#6 max state yes
#7 <NA> could state yes
稍微紧凑的选项是将%in%
用于多个元素
i1 <- !with(new1, (category == "min" & !is.na(category) &
status %in% c("state", "could state")))
new1[i1,]
# category status review
#1 max state yes
#4 max fine yes
#5 <NA> could state yes
#6 max state yes
#7 <NA> could state yes
如果我们同时使用%in%
,我们可以避免使用is.na
i1 <- !with(new1, (category %in% "min" & status %in% c("state", "could state")))
new1[i1,]
注意:在上述所有情况下,使用with
时,我们不需要执行new1$
,只需使用列名来获取值。
只是为了说明前一点,
v1 <- c(NA, 3, 4, 3)
v1==3
#[1] NA TRUE FALSE TRUE
请注意==
为NA值返回NA。如果我们使用is.na
v1 ==3 & !is.na(v1)
#[1] FALSE TRUE FALSE TRUE
或者使用%in%
为NA
v1 %in% 3
#[1] FALSE TRUE FALSE TRUE
关于NA行,如果我们根据==
条件进行子集,NA将保持不变
v1[v1==3]
#[1] NA 3 3
假设'v1'是data.frame
中的一列,代替NA,则会返回另一个NA行
d1 <- data.frame(v1)
d1[d1$v1==3,, drop=FALSE]
# v1
#NA NA
#2 3
#4 3
new1 <- structure(list(category = c("max", "min", "min", "max", NA, "max",
NA), status = c("state", "state", "state", "fine", "could state",
"state", "could state"), review = c("yes", "yes", "yes", "yes",
"yes", "yes", "yes")), .Names = c("category", "status", "review"
), class = "data.frame", row.names = c(NA, -7L))