从R中的字符串中获取非零值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从R中的字符串中获取非零值相关的知识,希望对你有一定的参考价值。

我有两个字符串:

x1 = "03011000"
x2 = "13001000"

字符串在非零字符中具有精确重叠。我想为每个角色位置获取最大元素。所以在这种情况下,结果将是:

result = "13011000"

第一个字符是1,因为x2在第一个位置有1。第四个字符也是1,因为x1在此位置有1。我的方式如下:

paste0(mapply(pmax, strsplit(x1, ""), strsplit(x2, "")), collapse = "")

但这似乎过分了,因为我必须将每个角色分成它们的组件并进行比较。有更好的方法吗?

答案

使用原始比较:

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"     
另一答案

字符串在非零字符中具有精确重叠。

我认为这意味着当两个字符串都非零时,它们保证匹配?

如果是这样,在一个向量中找到零的位置就足够了,而在另一个向量中找不到(用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"

以上是关于从R中的字符串中获取非零值的主要内容,如果未能解决你的问题,请参考以下文章

为熊猫中的每一列获取非零值

MATLAB求第一个非零值怎么写

用先前的非零值替换向量中的所有零

编译器是不是应该正确地将 bool 中的任意非零值解释为 true?

为啥 Keras Dropout 中的非零值会发生变化?

TSQL - 列中所有非零值的平均值