R中的条件字符串前缀

时间:2018-12-10 20:56:30

标签: r regex string paste

我有一个这样的数据框

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。请帮助我确定此功能出了什么问题,或者是否有更好的方法来实现此目的。

3 个答案:

答案 0 :(得分:4)

使用$('select[name="myselect"]').select2('data')[0].customparam ifelse检查元素是否以小写字母开头。

grepl

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

另一种选择是使用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'))