【问题标题】:translating string matches to a vector of binary elements将字符串匹配转换为二进制元素的向量
【发布时间】:2021-10-18 19:59:16
【问题描述】:

感谢您对以下问题的建议包或基本 R 解决方案的帮助(提前致谢。)

假设我有一个来自statistical_function 的字符元素向量(下面)。如果我提供两个字符元素的名称(例如,provided = c("high", "aware")),那么我需要一种机制来为我生成以下二进制向量:desired_vector = c(0,1,1,0,1)

长度:desired_vector 的长度与统计函数输出中的元素数减去名为intrcpt 的元素的长度相同。因此,在这种情况下,desired_vector 将具有 5 元素。

元素 A: 对于 statistical_function 的输出中不包含 :(例如 "weekhigh")但包含 provided 向量元素之一的每个元素("high") 我想要的向量应该是1

元素 B: 对于统计函数输出中包含 :(例如,"weekhigh:testeraware")和包含 provided 向量元素("high" & "aware") 我想要的向量应该是1

否则desired_vector 中的所有剩余元素都应为0。这可以在 R 中实现吗?

在下面的示例中,desired_vector 的第一个元素是 0,因为除了 intrcptweekssome 不包含 "high""aware",第二个元素是 1,因为 weekshigh"high",第3 个元素是1,因为"testeraware" 包含"aware",第4 个元素是0,因为"weekssome:testeraware" 不包含"high""aware",第5 个元素是@987654因为它确实包含"high""aware"

statistical_function = c("intrcpt","weekssome","weekshigh",            
"testeraware","weekssome:testeraware","weekshigh:testeraware")

# [1] "intrcpt"               "weekssome"             "weekshigh"            
# [4] "testeraware"           "weekssome:testeraware" "weekshigh:testeraware"

provided_vector = c("high", "aware")

desired_vector = c(0, 1, 1, 0, 1)

【问题讨论】:

    标签: r regex string character tidyverse


    【解决方案1】:

    你可以试试下面的代码

    +(
      abs(
        grepl(":", statistical_function) -
          rowSums(
            sapply(provided_vector, grepl, statistical_function)
          )
      ) == 1)[
      statistical_function != "intrcpt"
    ]
    

    给了

    [1] 0 1 1 0 1
    

    【讨论】:

    • @rnorouzian 也许你可以试试unique(trimws(strsplit(aa, "[*+:]")[[1]]))
    • @rnorouzian grep("\\D", unique(trimws(strsplit(aa, "[*+:]")[[1]])), value = TRUE) 怎么样?
    • @rnorouzian 如果aa 有多个字符串,你应该使用grep("\\D", unique(trimws(unlist(strsplit(aa, "[*+:]")))), value = TRUE)
    【解决方案2】:

    我不确定以下方法是否是您正在寻找的方法。我不确定你是否总是想删除第一个元素。为了对要删除的内容进行一些控制,我添加了 drop 参数。它采用要删除的元素的数量或带有要删除的元素名称的字符串。它默认为drop = "intrcpt",它会丢弃拦截。

    # the input vector containing the coefficient names
    statistical_function  <- c("intrcpt",
                               "weekssome",
                               "weekshigh",
                               "testeraware",
                               "weekssome:testeraware",
                               "weekshigh:testeraware")
    
    # the input vector containg the search pattern
    provided_vector = c("high", "aware")
    
    # a function which matches both
    test_input <- function(in_func, in_vec, drop = "intrcpt") {
      
      if(!is.null(drop)) {
        if(is.numeric(drop)) {
          in_func <- in_func[-drop]
        } else if (is.character(drop)) {
          in_func <- in_func[in_func != drop]
        }
      }
      
      inp <- strsplit(in_func, ":")
      
      pat <- paste(in_vec, collapse = "|")
      
      vapply(inp,
             FUN = function(x) all(grepl(pat, x)), 
             FUN.VALUE = numeric(1L))
    }
    
    # this does not drop the intercept, so this is not the desired result
    test_input(statistical_function, provided_vector)
    #> [1] 0 1 1 0 1
    
    # these calls drop the "intrcpt" or the first element
    test_input(statistical_function, provided_vector, drop = "intrcpt")
    #> [1] 0 1 1 0 1
    test_input(statistical_function, provided_vector, drop = 1)
    #> [1] 0 1 1 0 1
    
    # test: still working
    test_input(statistical_function[-1], provided_vector)
    #> [1] 0 1 1 0 1
    

    reprex package (v2.0.1) 于 2021-08-16 创建

    如果拦截总是以相同的方式写入intrcpt,那么我们可以最小化上面的函数并删除drop 参数:

    test_input <- function(in_func, in_vec) {
      
      inp <- in_func[in_func != "intrcpt"]
      inp <- strsplit(inp, ":")
      
      pat <- paste(in_vec, collapse = "|")
      
      vapply(inp,
             FUN = function(x) all(grepl(pat, x)), 
             FUN.VALUE = numeric(1L))
    }
    

    【讨论】:

    • 亲爱的蒂姆,首先感谢您阅读我的长文,甚至提供解决方案。我感激不尽。如果有一个名为"intrcpt" 的元素,它将是第一个元素。但我注意到有一个错误。如果您将"intrcpt" 放入statistical_function = c("weekssome","weekshigh", "testeraware","weekssome:testeraware","weekshigh:testeraware"),那么您的函数将返回1 1 0 1,这意味着"weekssome" 包含"high",当然这是不正确的。
    • 谢谢蒂姆,这样效果更好。本质上,如果statistical_function 中存在"intrcpt",我们希望该函数忽略。
    猜你喜欢
    • 2021-12-29
    • 2020-01-19
    • 2018-01-11
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多