用R中的`subset`函数找到补码

时间:2018-08-31 14:04:33

标签: r dataframe subset

我使用的软件包使用base::subset语法。 现在,我不仅要找到子集,还要找到补数。

已经有一个类似的问题,但这并不依赖于base::subsetTake the complement of DF's subset

以某种方式可以找到base::subset的补语。

## Example data frame
df <- data.frame(
    a1 = 1:5,
    a2 = 2:6,
    b1 = c(NA, 1:4),
    b2 = rep(NA, 5)
)

## Split part 1
split1 <- subset(
    df,
    (a1 >= 3 | a2 >= 3) &
    (b1 >= 2 | b2 >= 3)
)

## Split part 2
split2 <- subset(
    df,
    (!(a1 >= 3) &
     !(a2 >= 3)) |
    (
        (!(b1 >= 2) |
         is.na(b1)) &
        (!(b2 >= 3) |
         is.na(b2))
    )
)

但是有没有更简单的方法? (补语实际上应该是补语,包括NA。)

由于我有时不得不重复一遍,因此创建函数可能更容易。但是我不知道如何将参数a1 >= 3传递给函数。

2 个答案:

答案 0 :(得分:2)

保持NA的{​​{1}}条件

split2

保持cond <- with(df, (a1 >= 3 | a2 >= 3) & (b1 >= 2 | b2 >= 3)) #[1] FALSE NA TRUE TRUE TRUE complement_cond <- !cond | is.na(cond) #[1] TRUE TRUE FALSE FALSE FALSE split1 <- subset(df, cond) split2 <- subset(df, complement_cond) 的{​​{1}}条件

NA

Dan's answer

的变体

保持split1的{​​{1}}条件

cond <- with(df, (a1 >= 3 | a2 >= 3) &  (b1 >= 2 | b2 >= 3))
cond <- cond | is.na(cond)
#[1] FALSE  TRUE  TRUE  TRUE  TRUE

complement_cond <- !cond
#[1]  TRUE FALSE FALSE FALSE FALSE

split1 <- subset(df, cond)
split2 <- subset(df, complement_cond)

保持NA的{​​{1}}条件

split2

答案 1 :(得分:2)

您可以在df上添加唯一标识符,然后根据以下内容使用subset

df$id <- 1:nrow(df)

split1 <- subset(
df,
 (a1 >= 3 | a2 >= 3) &
 (b1 >= 2 | b2 >= 3)
 )


split2 <- subset(df, !df$id %in% split1$id)