2016-09-23 70 views
0

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

R中的函数不应该修改它们之外的值。函数不应该有“副作用”这一事实是函数式编程的核心原则(而R是一种函数式编程语言)。当您尝试从函数作用域外部修改变量时,该函数会更改仅在该函数内可访问的副本。

做的正确的事是返回修改的对象,做功能

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

我看外面的重新分配,但建议的代码不出于某种原因。它给出了以下错误:“X $ Col1中的错误:$运算符对原子向量无效” – babesz

+0

您是否将原始数据框传递给函数? – MrFlick

+0

哎呀,对不起,它可行 - 谢谢!我可以问你在你的函数中做什么“返回”,以及你如何在X $ Col1的第二行代替D $ Col1?参数(X1)和对象(D1)不应该是太单独的项目吗? – babesz