【问题标题】:Conditional String Prefix in RR中的条件字符串前缀
【发布时间】:2018-12-10 20:56:29
【问题描述】:

我有一个这样的数据框

X <- data.frame(value = c(1,2,3,4,5,6), 
            variable = c("AA", "ab", "BB", "ad", "da", "DD"))

我试图有条件地在所有变量上添加一个字符前缀,以便生成的数据框是这样的(当我们有大写字母时以 G 为前缀,当我们有小写字母时以 M 为前缀)

1   GAA
2   Mab
3   GBB
4   Mad
5   Mda
6   GDD

我试着写一个函数来实现,看起来像这样

prefix <- function(raw_data)
{
  if(raw_data$Members %like% "^[a-z]") {
    raw_data$Members = paste0('M', raw_data$Members)
  }
  else {if(raw_data$Members %like% "^[A-Z]")
  {
    raw_data$Members = paste0('G', raw_data$Members)
  }
  }
}

它要么只是 G 前缀,要么只是 M 前缀。请帮助我确定这个函数有什么问题,或者是否有更好的方法来做到这一点。

【问题讨论】:

    标签: r regex string paste


    【解决方案1】:

    使用ifelsegrepl 来检查元素是否以小写字母开头。

    ifelse(grepl("^[a-z]", X$variable), paste0("M", X$variable), paste0("G", X$variable))
    #[1] "GAA" "Mab" "GBB" "Mad" "Mda" "GDD"
    

    【讨论】:

      【解决方案2】:

      检查变量的tolower 版本是否等于原始变量,并使用结果来索引带有“G”和“M”的向量:

      paste0(c("G", "M")[(X$variable == tolower(X$variable)) + 1], X$variable)
      # [1] "GAA" "Mab" "GBB" "Mad" "Mda" "GDD"
      

      【讨论】:

      • 这实际上比@markus 提供的解决方案要快。我用原始数据帧的较长版本(使用microbenchmark)对它们进行了基准测试,并使用此版本获得了大约 2.5 倍的加速。我猜严格测试两个字符串的相等性比正则表达式测试更快?
      • @Thanks Henrik,这也是一个很好的解决方案,正如 qdread 所说的更快。
      • @qdread 感谢您的基准测试。可能是没有正则表达式和没有ifelse 的组合,这有助于加速。
      【解决方案3】:

      另一种选择是使用sub。在这种情况下可能不是最好的解决方案,但它是“R 中的条件字符串前缀”的更通用解决方案。

      X$variable <- sub('(?=^[A-Z])', 'G', X$variable, perl = T)
      
      X$variable <- sub('(?=^[a-z])', 'M', X$variable, perl = T)
      
      X
      
      #   value variable
      # 1     1      GAA
      # 2     2      Mab
      # 3     3      GBB
      # 4     4      Mad
      # 5     5      Mda
      # 6     6      GDD
      

      Tidyverse 等价物:

      library(tidyverse)
      
      X %>% 
        mutate_at('variable', ~ str_replace(., '(?=^[A-Z])', 'G') %>% 
                                  str_replace('(?=^[a-z])', 'M'))
      

      【讨论】:

        猜你喜欢
        • 2016-04-28
        • 2021-10-05
        • 2021-11-30
        • 2015-09-19
        • 1970-01-01
        • 2011-05-04
        • 2013-08-27
        • 1970-01-01
        • 2021-06-08
        相关资源
        最近更新 更多