lapply 2在一个命令中起作用

时间:2014-06-19 09:23:10

标签: r dataframe lapply names

我想更改数据框df

中的一些名称
> names(df)[17:26]
[1] "X1."  "X2."  "X3."  "X4."  "X5."  "X6."  "X7."  "X8."  "X9."  "X10."

我想要“X” - > “到达”并删除点。 我使用了lapply:

change <- function(d){
    gsub("X","reach",d) 
    gsub("\\.","",d)
}
a <- as.character(lapply(names(df)[17:26], change))

但“X”没有改变。为什么呢?

> a 
[1] "X1"  "X2"  "X3"  "X4"  "X5"  "X6"  "X7"  "X8"  "X9"  "X10"

1 个答案:

答案 0 :(得分:6)

您可以使用返回引用(模式表达式的带括号的部分)在单个gsub中执行此操作。

x <- names(df)[17:26]
gsub( "X([0-9]+)." , "Reach\\1" , x )
# [1] "Reach1"  "Reach2"  "Reach3"  "Reach4"  "Reach5"  "Reach6"  "Reach7"  "Reach8"  "Reach9"  "Reach10"

我们使用[0-9]+匹配名称向量中的数字,并将它们括在括号中,我们制作所谓的后向引用。我们可以通过它的后引用来引用括号内匹配的东西。由于这是第一组括号,因此它的后引用为\\1。如果我们有另一组括号,我们可以将其称为\\2。我们匹配X,然后匹配一些数字,然后匹配.。我们将Reach替换为\\1以及括号内匹配的数字,方法是使用{{1}}引用后引用。

我希望这个解释有意义!这不是最清楚的。