我将一系列调查作为.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的答案?
答案 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模式参数中使用的那样使用加倍的反斜杠。