2016-09-23 25 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