如何在gsub模式中使用数字列表作为变量输入?

时间:2014-12-12 01:54:11

标签: r string gsub

我想只保留每个字符串的前半部分。导入的数据复制了名字,所有这些都在当前较大的数据框中:

fname:TimmyTimmy,PopPop,AdnanAdnan,KobeKobe。

第一个想法是计算字符/ 2,然后使用gsub替换该字符数,通过计算我想要从每个字符串的开头删除的字符数,使用fn_len作为模式中的变量。 / p>

fn_len:5,6,5,4

df$fname <- 
    gsub("^[[:alpha:]]{df$fn_len}", "", df$fname)

返回错误:正则表达式无效;原因'{}'的内容无效

如果我使用单个数字(例如1,2,3,4,5),代码可以工作,但显然不了解这里的一些模式规则。

或者,从一开始可能有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

这看起来像子串操作会更好

fname<-c("TimmyTimmy", "PopPop", "AdnanAdnan", "KobeKobe")
substr(fname, 1, nchar(fname)/2)
# [1] "Timmy" "Pop"   "Adnan" "Kobe" 

答案 1 :(得分:2)

如果模式类似于示例中显示的模式

 gsub("([A-Za-z]+)\\1+", "\\1", str1)
 #[1] "Timmy" "Pop"   "Adnan" "Kobe" 

或者

 scan(text=sub('(?<=[a-z])(?=[A-Z])', ' ', str1, perl=TRUE),
                            what='', quiet=TRUE)[c(TRUE, FALSE)]
 #[1] "Timmy" "Pop"   "Adnan" "Kobe" 

或者

 sapply(strsplit(str1, '(?<=[a-z])(?=[A-Z])', perl=TRUE), `[`,1)
 #[1] "Timmy" "Pop"   "Adnan" "Kobe" 

更新

适用于名称以lowercase

开头的字符串
  gsub('([A-Za-z]+)\\1+', '\\1', str2)
  #[1] "Timmy" "Pop"   "Adnan" "Kobe"  "tim"  

数据

 str1 <- c("TimmyTimmy", "PopPop", "AdnanAdnan", "KobeKobe")
 str2 <- c(str1, 'timtim')