使用以前的列名和正则表达式模式重命名 R 中的 Dataframe 列名

Rename Dataframe Column Names in R using Previous Column Name and Regex Pattern

我是第一次在 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 至 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

谁能帮我弄清楚这是怎么回事,并写出更好的正则表达式?非常感谢。

你的正则表达式本身没有问题。您正在寻找的可能是 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字符串可以任意长短。

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

您似乎在第一段数字后截断了列名。

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

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

regex demo

详情

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