仅当它是R中的特定字符时才替换字符串中的第n个字符

时间:2017-02-01 04:31:59

标签: r regex string tidyr

我将一系列调查作为.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")

我认为有一个正则表达式的答案,但我很难找到一个。也许还有一个tidyr的答案?

2 个答案:

答案 0 :(得分:6)

正如@thelatemail指出的那样,你的数据中没有一个在第五个位置实际上有下划线,但有些数据位于第六个位置(其他人有点)。基本R方法是使用var toDisplayNotification = @ViewBag.toDisplayNotification; //or var toDisplayNotification = @Html.Raw(ViewBag.toDisplayNotification);

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 :(得分:4)

您可以使用由任意排序的前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"

由于replacement参数与转义没有相同的问题,因此您不需要像在R-regex模式参数中使用的那样使用加倍的反斜杠。