使用上一列名称和正则表达式模式重命名R中的数据帧列名称

时间:2017-08-14 17:57:22

标签: r regex grep gsub

我第一次在R工作,我在数据框(Grade.Data)中重命名列名称时遇到了困难。我有一个从csv文件导入的数据集,其列名如下:     Student.ID

Grade    

Interactive.Exercises.1..Health

Interactive.Exercises.2..Fitness

Quizzes.1..Week.1.Quiz

Quizzes.2..Week.2.Quiz

Case.Studies.1..Case.Study1

Case.Studies.2..Case.Study2

我希望能够更改变量名称,以便它们更简单,即从Interactive.Exercises.1.Health到Interactive.Exercises.1或Quizzes.1.Week.1.Quiz to Quizzes.1。

到目前为止,我已经尝试过这个:

grep(".*[0-9]", names(Grade.Data))

但是我得到了回复:

[1]  3  4  5  6  7  8  9 11 12 13 14 15 16 17 19 20 21 22 23 24 25

任何人都可以帮我弄清楚发生了什么,写一个更好的正则表达式吗?非常感谢你。

3 个答案:

答案 0 :(得分:1)

似乎你在第一个数字块之后截断了列名。

您可以使用以下sub解决方案:

names(Grade.Data) <- sub("^(.*?\\d+).*$", "\\1", names(Grade.Data))

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • (.*?\\d+) - 第1组(稍后从替换模式中引用\1)尽可能少地匹配任何0+字符(.*?),然后匹配1个或多个数字({{ 1}})
  • \d+ - 尽可能多的0个字符
  • .* - 字符串结尾

答案 1 :(得分:0)

你的正则表达本身没有任何问题。您正在寻找的可能是regexpr的组合 - 它获取正则表达式的开始和结束 - 和regmatches - 它获得与regexpr的输出相对应的实际字符串:< / p>

start_end <- regexpr(".*[0-9]", names(Grade.data))
regmatches(names(Grade.data), start_end)
# [1] "Interactive.Exercises.1"     "Interactive.Exercises.2"    
# [3] "Quizzes.1..Week.1"           "Quizzes.2..Week.2"          
# [5] "Case.Studies.1..Case.Study1"

在点星后面添加问号会使正则表达式匹配尽可能少的字符,因此它将在第一个数字值后停止:

start_end <- regexpr(".*?[0-9]", names(Grade.data))
regmatches(names(Grade.data), start_end)
# [1] "Interactive.Exercises.1"     "Interactive.Exercises.2"    
# [3] "Quizzes.1"      "Quizzes.2"          
# [5] "Case.Studies.1"

答案 2 :(得分:0)

你应该使用函数names,在我写一个小例子之后,名字字符串可以根据你的需要。

names(x = Grade.Data) <- c("Col1_name", "Col2_name")