【问题标题】:How to use numeric list as a variable input within gsub pattern?如何使用数字列表作为 gsub 模式中的变量输入?
【发布时间】:2014-12-12 01:54:10
【问题描述】:

我想只保留每个字符串的前半部分。导入的数据与名字重复,目前都在一个更大的数据框中:

姓名:TimmyTimmy、PopPop、AdnanAdnan、KobeKobe。

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

fn_len:5、6、5、4

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

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

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

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

【问题讨论】:

  • 通常,R 会将"" 之间的任何内容解释为字符数据。 df$fn_len 不会被解释/替换为变量的值。在这种情况下,您需要使用 pastepaste0 或类似的东西,但从那里传递给 gsub 会变得复杂 - substr 是您最好的选择。 :-)

标签: r string gsub


【解决方案1】:

这确实看起来像子字符串操作会更好

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

【讨论】:

  • 感谢您的快速回复。这更直观。
【解决方案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')

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多