R中的条件字符串前缀



我有一个类似的数据帧

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。请帮助我确定这个函数有什么问题,或者是否有更好的方法。

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

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

检查变量的tolower版本是否等于原始版本,并使用结果为带有"G"one_answers"M"的向量编制索引:

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

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

最新更新