带有 2 个逻辑向量的向量化操作的问题:根据另一个向量中的 FALSE 值将第一个向量中的值替换为 NA
Problem with a vectorized operation with 2 logical vectors: replace values in first vector to NA according to FALSE values in the other vector
我对使用逻辑向量的向量化运算有疑问。在我的问题中,有两个向量:主要向量和次要向量。它们的长度相同。根据我从 secondary 向量中收集到的见解,我想将 main 向量中的一些元素替换为 NA
。
- 主向量由
TRUE
和 FALSE
组成,可以任意顺序出现。
- 辅助向量是:
- 一个
TRUE
序列然后一个FALSE
with/withoutNA
序列作为最后一个元素; 或
- 全部
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
我们可以这样做:
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
我们可以像下面那样尝试ifelse
> ifelse(y,x,NA)
[1] FALSE FALSE TRUE FALSE FALSE NA NA
我对使用逻辑向量的向量化运算有疑问。在我的问题中,有两个向量:主要向量和次要向量。它们的长度相同。根据我从 secondary 向量中收集到的见解,我想将 main 向量中的一些元素替换为 NA
。
- 主向量由
TRUE
和FALSE
组成,可以任意顺序出现。 - 辅助向量是:
- 一个
TRUE
序列然后一个FALSE
with/withoutNA
序列作为最后一个元素; 或 - 全部
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
我们可以这样做:
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
我们可以像下面那样尝试ifelse
> ifelse(y,x,NA)
[1] FALSE FALSE TRUE FALSE FALSE NA NA