r - 使用 2 个逻辑向量 : replace values in first vector to NA according to FALSE values in the other vector 进行向量化操作的问题

标签 r vector boolean vectorization

我对使用逻辑向量的向量化运算有疑问。在我的问题中,有两个向量:主要向量和次要向量。它们的长度相同。根据我从 secondary 向量中收集到的见解,我想将 main 向量中的一些元素替换为 NA

  • 主向量由 TRUEFALSE 组成,可以以任何随机顺序出现。
  • 辅助向量是:
    • 一个 TRUE 序列,然后是一个 FALSE 序列,有/没有 NA 作为最后一个元素;
    • 所有TRUE
    • 所有FALSE
    • 所有 FALSE,最后一个元素为 NA
    • 所有 TRUE,最后一个元素为 NA

我将在下面提供几个示例并解释所需的算法。

A - 最常见的情况
对于 y

中为 FALSE 的位置,将 x 值替换为 NA
# here, `x` is the main vector
x <- c(FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, NA)

# `y` is the secondary vector
y <- c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE)

# `z` is the desired output
z <- c(FALSE, FALSE, TRUE, FALSE, FALSE, NA, NA) # in this case only index 7 in `x` actually changed

B - 辅助向量全部为 FALSE

x2 <- c(FALSE, NA)
y2 <- c(FALSE, FALSE)

# desired output
z2 <- c(NA, NA)

C - 辅助向量全部为 TRUE

x3 <- rep(FALSE, 4)
y3 <- rep(TRUE, 4)

# desired output
z3 <- rep(FALSE, 4)

我的尝试
我几乎已经想通了,但不幸的是,它在场景 B 中失败了。

my_func <- function(main, secondary) {
  
  idx_last_true_in_secondary <- max(which(secondary))
  
  if(idx_last_true_in_secondary == length(secondary)) {
    return(main)
  }
  
  main[(idx_last_true_in_secondary + 1): length(main)] <- NA
  main
}

# case A
my_func(x, y)
#> [1] FALSE FALSE  TRUE FALSE FALSE    NA    NA

# case B
my_func(x2, y2)
#> Warning in max(which(secondary)): no non-missing arguments to max; returning
#> -Inf
#> Error in (idx_last_true_in_secondary + 1):length(main): result would be too long a vector

# case C
my_func(x3, y3)
#> [1] FALSE FALSE FALSE FALSE

我的问题是是否有人看到了解决问题的更好方法?

最佳答案

这似乎按预期工作:

my_func <- function(main,secondary ) {
  main[!secondary] <- NA
  return(main)
}

my_func(x,y)
[1] FALSE FALSE  TRUE FALSE FALSE    NA    NA

my_func(x2,y2)
[1] NA NA

my_func(x3,y3)
[1] FALSE FALSE FALSE FALSE

关于r - 使用 2 个逻辑向量 : replace values in first vector to NA according to FALSE values in the other vector 进行向量化操作的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70494080/

相关文章:

c - 如何访问动态 vector 的元素?

javascript - JavaScript 中 boolean 值的数学运算符

R Shiny 显示 checkboxGroupInput 水平

r - 使用 R 中的自动绘图 (ggfortify) 绘制主成分 3,4

r - 如何在 R 的字符向量中找到最常见的单词?

c++ - vector 超出范围,但为什么?

r - 通过具有任意函数的非整数因子聚合栅格

c++ - 从长 vector 中释放内存

python - Julia 中数组的逻辑运算

javascript - Javascript : Array. 长度表达式计算为 boolean 值