我想只保留每个字符串的前半部分。导入的数据复制了名字,所有这些都在当前较大的数据框中:
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),代码可以工作,但显然不了解这里的一些模式规则。
或者,从一开始可能有更好的方法来做到这一点?
答案 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')