我第一次在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
任何人都可以帮我弄清楚发生了什么,写一个更好的正则表达式吗?非常感谢你。
答案 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")