我有一个类似的数据帧
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。请帮助我确定这个函数有什么问题,或者是否有更好的方法。
使用ifelse
和grepl
检查元素是否以小写字母开头。
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'))