【问题标题】:Problem with a vectorized operation with 2 logical vectors: replace values in first vector to NA according to FALSE values in the other vector具有 2 个逻辑向量的向量化操作的问题:根据另一个向量中的 FALSE 值将第一个向量中的值替换为 NA
【发布时间】:2022-01-26 08:03:36
【问题描述】:

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

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

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

A - 最常见的情况
x 值替换为 NA 用于 FALSEy 中的位置

# 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

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

【问题讨论】:

    标签: r vector boolean vectorization


    【解决方案1】:

    我们可以试试ifelse,如下所示

    > ifelse(y,x,NA) 
    [1] FALSE FALSE  TRUE FALSE FALSE    NA    NA
    

    【讨论】:

      【解决方案2】:

      这似乎按预期工作:

      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
      

      【讨论】:

        【解决方案3】:

        我们可以这样做:

        my_func <- function(x, y) {
          replace(x, !y, NA)
        }
        

        它是如何工作的:

        # A
        replace(x, !y, NA)
        [1] FALSE FALSE  TRUE FALSE FALSE    NA    NA
        
        # B
        replace(x2, !y2, NA)
        [1] NA NA
        
        # C
        replace(x3, !y3, NA)
        [1] FALSE FALSE FALSE FALSE
        
        my_func(x,y)
        my_func(x2,y2)
        my_func(x3,y3)
        

        输出:

        > 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
        

        【讨论】:

          猜你喜欢
          • 2021-07-26
          • 2011-04-23
          • 1970-01-01
          • 1970-01-01
          • 2018-03-29
          • 2021-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多