功能范围 - 重命名列

时间:2018-03-05 19:07:33

标签: r

通常,如果我尝试在R中重命名数据帧的列,请使用

data(iris)
colnames(iris)[colnames(iris) == "Petal.Length"] <- "petal_height"

所以我想如果我把它变成一个简单的函数我会看到发生了什么

renamer <- function(data, oldname, newname) {
  colnames(data)[colnames(data) == oldname] <- newname
}

然而,虽然该函数运行时没有错误,但它似乎没有对数据帧做出任何明显的改变。

renamer(iris, "Petal.Length", "petal_height")

虽然这只是将newname分配给iris的值

iris <- renamer(iris, "Petal.Length", "petal_height")

是否有人能够解释为什么会发生这种行为?

请注意,我实际上并不需要重命名功能。我只是想了解为什么这样做不像我想象的那样有效。

2 个答案:

答案 0 :(得分:1)

平原:

renamer(iris, "Petal.Length", "petal_height")

不会更改iris对象,因为R在函数内使用局部作用域。变化不会泄漏&#34;直到调用上下文(没有做特殊的技巧。不要这样做)。

当你这样做时:

iris <- renamer(iris, "Petal.Length", "petal_height")

它不起作用,因为函数的返回值是return(...)函数调用中的参数或函数的最后一个参数。所以:

renamer <- function(data, oldname, newname) {
  colnames(data)[colnames(data) == oldname] <- newname
  return(data)
}

应与iris = renamer(iris,....)

一起使用

当你的功能结束时:

colnames(data)[colnames(data) == oldname] <- newname

然后R在该函数中做的最后一件事是评估newname,因此返回"petal_height"

答案 1 :(得分:-1)

使用package::dplyr

iris %>% rename_all(function(x)tolower(gsub('\\.', '_', x, perl = TRUE))) %>% colnames()
[1] "sepal_length" "sepal_width"  "petal_length" "petal_width"  "species" 

编辑注释,表示这不代表虹膜中的列名....

> data("iris")
> colnames(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"  

> iris %>% rename_all(function(x)sprintf('[OLD]%s | [NEW]%s', x, tolower(gsub('\\.', '_', x, perl = TRUE)))) %>% 
head(1) %>% str

'data.frame':   1 obs. of  5 variables:
 $ [OLD]Sepal.Length | [NEW]sepal_length: num 5.1
 $ [OLD]Sepal.Width | [NEW]sepal_width  : num 3.5
 $ [OLD]Petal.Length | [NEW]petal_length: num 1.4
 $ [OLD]Petal.Width | [NEW]petal_width  : num 0.2
 $ [OLD]Species | [NEW]species          : Factor w/ 3 levels