这似乎是一个简单的问题,但我还没能成功谷歌。我有两个字符串向量,我想基于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")
。
感谢您的帮助。
答案 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)
您想要的somefunction
是ifelse
:
strvec1 <- c("str1", "str2", "str3")
strvec2 <- c("alt1", "alt2", "alt3")
boolvec <- c(FALSE, FALSE, TRUE)
ifelse(boolvec, strvec2, strvec1)
# [1] "str1" "str2" "alt3"
注意:请注意strvec1
和strvec2
的顺序。 TRUE
映射到第二个(if
)参数,FALSE
映射到第三个(else
)参数。