通常,如果我尝试在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")
是否有人能够解释为什么会发生这种行为?
请注意,我实际上并不需要重命名功能。我只是想了解为什么这样做不像我想象的那样有效。
答案 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