R有条件地改变字符串

时间:2015-01-19 21:41:59

标签: r string

这似乎是一个简单的问题,但我还没能成功谷歌。我有两个字符串向量,我想基于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")

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

另一种选择就是

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

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

答案 1 :(得分:1)

如果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 

答案 2 :(得分:1)

您想要的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)参数。