使用函数重命名字符变量

Using functions to rename a character variable

我有一个数据框,其中第一列是代表一个国家地区的字符变量,其他列包含一些数字数据。我想在第一列的名称中添加一个后缀,以指示各区所属的区域。假设前两个 "NR",第三个到第五个 "BB"(这些行可以与其他地区继续)

D=data.frame("Col1" = c("Levice", "Nitra", "Brezno", "Detva", "Zvolen"),
                     "Col2" = 1:5, stringsAsFactors=F)   

我想我可以用代码来做到这一点:

D$Col1[1:2]=paste(D$Col1[1:2],"NR", sep=".")
D$Col1[3:5]=paste(D$Col1[3:5],"BB", sep=".")

所以我明白了:

Col1        Col2
Levice.NR   1
Nitra.NR    2
Brezno.BB   3
Detva.BB    4
Zvolen.BB   5

但是,如果我尝试将代码放入函数中,结果不会存储在我的数据框中:

Suffix=function(X1){
D1=(X1=D$Col1[1:2])
paste(D$Col1[1:2],"NR", sep=".")
}
Suffix(D)
"Levice.NR" "Nitra.NR" 

或者如果我修改它,不起作用:

Suffix=function(X1){
D1=(X1=D$Col1[1:2])
D$Col1[1:2]=paste(D$Col1[1:2],"NR", sep=".")
}
Suffix(D)
#just nothing happens to the data frame

你能帮忙看看函数有什么问题吗?

R 中的函数不应修改自身以外的值。事实上,函数不应该有 "side-effects" 是函数编程的核心原则(R 是一种函数编程语言)。当您尝试从函数范围外修改变量时,该函数会对只能在函数内部访问的副本进行更改。

正确的做法是return修改对象并在函数外进行重新赋值

Suffix <- function(X) {
    X$Col1[1:2] <- paste(X$Col1[1:2],"NR", sep=".")
    return(X)
}
D <- Suffix(D)