2016-09-23 12 views
0

私は、最初の列が国の地区の文字変数であり、他の列が数値データを含むデータフレームを持っています。最初の列の名前に接尾辞を付けて、地区が属している地域を示したいと思います。のは、最初の2に「NR」と言ってみましょう、「BB」から5番目の3分の1(行は他の地区で続けることができる)関数を使用して文字変数の名前を変更する

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

私は、コードでこれを行うことができることを考え出し:

私は関数にコードを配置しようとした場合、結果は私のデータフレームに格納されていない、しかし、

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の2行目のD $ Col1をどうやって入れ替えることができますか?引数(X1)とオブジェクト(D1)はあまりにも別々の項目ではないでしょうか? – babesz

関連する問題