我使用的软件包使用base::subset
语法。
现在,我不仅要找到子集,还要找到补数。
已经有一个类似的问题,但这并不依赖于base::subset
:Take 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
传递给函数。
答案 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
保持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)