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



我是第一次使用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

我希望能够更改变量名称,使它们更简单,即从交互式

.练习.1.健康到交互式.练习.1或测验.1.周.1.测验到测验.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

谁能帮我弄清楚发生了什么,并写一个更好的正则表达式?非常感谢。

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

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

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

查看正则表达式演示

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

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

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"

你应该使用函数names,下面我写一个小例子,名称字符串可以根据需要长。

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

最新更新