关于R中过滤器的说明

时间:2016-05-28 05:05:24

标签: r

我在数据集新

中有三个可变类别,状态和审核
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 = minstatus = 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 = minstatus = 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 = minstatus = state以及could state时删除)。我提到了其他可用的问题

1 个答案:

答案 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

返回FALSE可以避免这种情况
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))