我有两个字符串:
x1 = "03011000"
x2 = "13001000"
字符串的非零字符完全重叠。我想获得每个字符位置的max元素。 因此,在这种情况下,结果将是:
result = "13011000"
第一个字符为1,因为x2在第一个位置具有1。第四个字符也是1,因为x1在此位置具有1。 我的解决方法如下:
paste0(mapply(pmax, strsplit(x1, ""), strsplit(x2, "")), collapse = "")
但是这似乎太过分了,因为我必须将每个字符分解成各个部分并进行比较。有更好的方法吗?
答案 0 :(得分:8)
使用原始比较:
rawToChar(as.raw(pmax(as.numeric(charToRaw(x1)), as.numeric(charToRaw(x2)))))
# [1] "13011000"
我们可以将其包装成一个函数:
foo <- function(x, y){
mapply(FUN = function(x, y) {
rawToChar(as.raw(pmax(as.numeric(charToRaw(x)), as.numeric(charToRaw(y)))))
}, x = x, y = y, USE.NAMES = FALSE)
}
x1 <- "03011000"
x2 <- "13001000"
foo(x1, x2)
# [1] "13011000"
x1 <- c("03011000", "ab", "123")
x2 <- c("13001000", "cd", "212")
foo(x1, x2)
# [1] "13011000" "cd" "223"
答案 1 :(得分:3)
字符串的非零字符完全重叠。
我认为这意味着当两个字符串都不为零时,可以保证它们匹配吗?
如果是这样,就足以在一个向量中找到零位置,而在另一个向量中(setdiff
)而不是零,并进行字符串编辑:
r <- gregexpr("0", c(x1,x2))
w <- setdiff(r[[1]], r[[2]])
rr <- structure(w, match.length = rep(1L, length(w)), useBytes = TRUE)
x = x1
regmatches(x, rr) <- regmatches(x2, rr)
x
# [1] "13011000"