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