【问题标题】:replacing the nth character in a string only if it is a particular character in R仅当字符串中的第 n 个字符是 R 中的特定字符时才替换它
【发布时间】:2017-06-17 17:42:07
【问题描述】:

我正在将一系列调查作为 .csv 文件导入并组合成一个数据集。问题是对于七个文件之一,一些变量的导入略有不同。数据集很大,我想找到一种方法来编写一个函数来运行给我带来麻烦的数据集。

在一些变量中,当应该有一个点时有一个下划线。并非所有变量都具有相同的格式,但不正确的变量是,因为下划线始终是列名的第 6 个元素。

我希望 R 查找第 6 个元素,如果它是下划线,则将其替换为点。下面是一个虚构的例子。

col_names <- c("s1.help_needed",
               "s1.Q2_im_stuck",
               "s1.Q2.im_stuck",
               "s1.Q3.regex",
               "s1.Q3_regex",
               "s2.Q1.is_confusing",
               "s2.Q2.answer_please",
               "s2.Q2_answer_please",
               "s2.someone_knows_the answer",
               "s3.appreciate_the_help")

我认为对此有一个正则表达式的答案,但我正在努力寻找一个。也许还有一个整洁的答案?

【问题讨论】:

  • 据我所知,您的所有示例都没有在第 5 个字符中包含下划线。
  • 是的,向左滚动,例如s1.Q3_regex
  • @TimBiegeleisen - 这是第 6 个字符
  • @thelatemail 很好,我什至没有数,我的眼睛抓住了那些下划线,然后我急忙回答。我认为这是 OP 真正想要的。

标签: r regex string tidyr


【解决方案1】:

正如@thelatemail 指出的那样,您的数据实际上在第五位没有下划线,但有些数据在第六位(其他人有点)。基本的 R 方法是使用 gsub():

result <- gsub("^(.{5})_", "\\1.", col_names)

> result
 [1] "s1.help_needed"              "s1.Q2.im_stuck"             
 [3] "s1.Q2.im_stuck"              "s1.Q3.regex"                
 [5] "s1.Q3.regex"                 "s2.Q1.is_confusing"         
 [7] "s2.Q2.answer_please"         "s2.Q2.answer_please"        
 [9] "s2.someone_knows_the answer" "s3.appreciate_the_help"

这里是正则表达式的解释:

^         from the start of the string
(.{5})    match AND capture any five characters
_         followed by an underscore

括号中的数量称为捕获组,可通过\\1 用于替换。所以正则表达式是说用我们捕获的五个字符替换前六个字符,但使用一个点作为第六个字符。

【讨论】:

  • 是否需要sapplygsub("^(.{5})_", "\\1\\.", col_names) 不工作?
  • @SymbolixAU 我不知道gsub() 可以做到这一点。
  • 我认为你不需要逃避 . : gsub("^(.{5})_", "\\1.", col_names)
  • 不需要使用gsub。由于只需要一个替换,使用sub 会更安全,尽管插入符号确实使这个答案明确..
  • @Jota - 一个丑陋的substr(col_names,6,6) &lt;- substr(chartr("_",".",col_names),6,6) 在速度方面很有竞争力,但不幸的是不是很简洁
【解决方案2】:

您可以使用由任意类型的前 4 个(实际上是 5 个)字符后跟一个下划线定义的“捕获类”,并用这 5 个字符后跟一个“点”的任何字符替换。由于所有示例的第 6 位都有下划线,我猜你没有计算原始的“点”:

> col_names
 [1] "s1.help_needed"              "s1.Q2_im_stuck"             
 [3] "s1.Q2.im_stuck"              "s1.Q3.regex"                
 [5] "s1.Q3_regex"                 "s2.Q1.is_confusing"         
 [7] "s2.Q2.answer_please"         "s2.Q2_answer_please"        
 [9] "s2.someone_knows_the answer" "s3.appreciate_the_help"     
> sub("^(.....)_", "\\1.", col_names)
 [1] "s1.help.needed"              "s1.Q2.im_stuck"             
 [3] "s1.Q2.im.stuck"              "s1.Q3.regex"                
 [5] "s1.Q3.regex"                 "s2.Q1.is.confusing"         
 [7] "s2.Q2.answer.please"         "s2.Q2.answer_please"        
 [9] "s2.someone.knows_the answer" "s3.appreciate.the_help"

由于替换参数不存在与转义相同的问题,因此您不需要像在 R-regex 模式参数中使用的那样使用双反斜杠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2017-07-13
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多