R有条件地改变字符串

R Conditionally Alter String

这似乎是个简单的问题,但我没能成功google。我有两个字符串向量,我想根据 TRUE FALSE 的第三个向量组合它们。

示例:

strvec1 <- c("str1", "str2", "str3")
strvec2 <- c("alt1", "alt2", "alt3")
boolvec <- c(FALSE, FALSE, TRUE)

我想调用 somefunction(strvec1, strvec2, boolvec),结果是 c("str1", "str2", "alt3")

感谢您的帮助。

如果strvectors长度相同,你可以这样做:

cbind(strvec1, strvec2)[cbind(seq_along(strvec1), boolvec+1)]
# [1] "str1" "str2" "alt3"

在函数中:

f <- function(x,y,z) cbind(x, y)[cbind(seq_along(x), z+1L)]
f(strvec1, strvec2, boolvec)
# [1] "str1" "str2" "alt3"

另一种选择是 replace:

f2 <- function(x, y, z) replace(x, which(z), y[z])
f2(strvec1, strvec2, boolvec)
# [1] "str1" "str2" "alt3"

这里有一些比较 - 仅作为粗略指示:

strvec1 <- sample(letters, 1e6, T)
strvec2 <- sample(letters, 1e6, T)
boolvec <- sample(c(TRUE, FALSE), 1e6, T)
somefunction <- function(x, y, z) ifelse(z, y, x)
f <- function(x,y,z) cbind(x, y)[cbind(seq_along(x), z+1L)]
system.time(somefunction(strvec1, strvec2, boolvec))
#       User      System     elapsed 
#      0.494       0.025       0.519 
system.time(f(strvec1, strvec2, boolvec))
#       User      System     elapsed 
#      0.048       0.008       0.056 
system.time(f2(strvec1, strvec2, boolvec))
#       User      System     elapsed 
#      0.048       0.002       0.050 

另一种选择就是

somefunction <- function(x, y, z) ifelse(z, y, x)

somefunction(strvec1, strvec2, boolvec)
## [1] "str1" "str2" "alt3"

你要的somefunctionifelse:

strvec1 <- c("str1", "str2", "str3")
strvec2 <- c("alt1", "alt2", "alt3")
boolvec <- c(FALSE, FALSE, TRUE)

ifelse(boolvec, strvec2, strvec1)
# [1] "str1" "str2" "alt3"

注意:注意 strvec1strvec2 的顺序。 TRUE 映射到第二个 (if) 参数,FALSE 映射到第三个 (else) 参数。