我有一个数据框,其中第一列是一个代表一个国家/地区的字符变量,其他列包含一些数字数据。我想为第一列中的名称添加后缀,以指示区域所属的区域。让我们说“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
你能帮助解决这个功能的问题吗?
答案 0 :(得分:0)
R中的函数不应修改自身之外的值。功能不应具有副作用的事实"是函数编程的核心原则(R是函数式编程语言)。当您尝试从函数范围外部修改变量时,该函数会对只能在函数内部访问的副本进行更改。
正确的做法是返回一个修改过的对象并在函数
之外进行重新赋值Suffix <- function(X) {
X$Col1[1:2] <- paste(X$Col1[1:2],"NR", sep=".")
return(X)
}
D <- Suffix(D)