使用函数重命名字符变量

时间:2016-09-23 13:57:32

标签: r function paste

我有一个数据框,其中第一列是一个代表一个国家/地区的字符变量,其他列包含一些数字数据。我想为第一列中的名称添加后缀,以指示区域所属的区域。让我们说“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

你能帮助解决这个功能的问题吗?

1 个答案:

答案 0 :(得分:0)

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

正确的做法是返回一个修改过的对象并在函数

之外进行重新赋值
Suffix <- function(X) {
    X$Col1[1:2] <- paste(X$Col1[1:2],"NR", sep=".")
    return(X)
}
D <- Suffix(D)