T/F 向量的条件否定

问题描述 投票:0回答:1

可以吗!运算符或其相反,动态分配给变量然后用作计算输入?有一组 data.frames,我根据 T/F 条件切换其子集。这是一个示例,其中早期的代码确定 m.true.false 是 true 还是 false。或者 m.true.false 是函数的参数。

m.true.false <- T  #  or in other instances, F
df.1 <- data.frame(cell.id = 1:10, predictor = runif(n = 10))  
# and there are a bunch of similar data frames.
test.cells <- c(1, 4:6)

if (m.true.false) {
    subset.1 <- df.1[df.1$cell.id %in% test.cells, ]
} else {
    subset.1 <- df.1[!df.1$cell.id %in% test.cells, ]
}

我想使用或修改 m.true.false ,以便 m.true.false 是一组子集命令的简单输入,从而反转要保留每个数据帧的行的选择。这显示了概念,但产生了一个空集。

subset.1 <- df.1[m.true.false * (df.1$cell.id %in% test.cells), ]

中等丑陋的解决方案是:

helper.true.false <- ifelse(m.true.false, 0, 1)
subset.1 <- df.1[as.logical(abs((df.1$cell.id %in% test.cells) - helper.true.false)), ]

有更简单的替代方案吗?作为 MRE,差异很小,但我有多种类似的用途。

如果 m.true.false 是静态的,则这些问题的答案有效:%in% 的相反:排除向量中指定值的行R 中 %in% 的否定

r operators negation
1个回答
1
投票

只需有条件地返回您的逻辑向量或否定的逻辑向量:

idx <- df.1$cell.id %in% test.cells
df.1[if (m.true.false) idx else !idx,]

您可以定义一个返回行选择的函数,然后使用

Negate
有条件地反转此选择:

set.seed(1)

m.true.false <- F  #  or in other instances, F
df.1 <- data.frame(cell.id = 1:10, predictor = runif(n = 10))  
# and there are a bunch of similar data frames.
test.cells <- c(1, 4:6)

f <- \() df.1$cell.id %in% test.cells
f <- if (m.true.false) f else Negate(f)

df.1[f(),]

或者创建一个函数,在其中传递逻辑向量,它会在全局环境中搜索

m.true.false
并进行相应的调整。这样你就可以在任何条件下使用它:

f <- function(x) {
  if (m.true.false) x else !x
}

df.1[f(df.1$cell.id %in% test.cells),]
© www.soinside.com 2019 - 2024. All rights reserved.