2017-12-12 25 views
1

私は以前のものに基づいて新しいオブジェクトを作成する関数を書こうとしていました。しかし、私はそれをすることはできませんでした。 はここに私のデータフレームです:Rの関数で新しいデータフレームを作成する

Names <- c("Tom", "Alex", "James", "John", "Wayne", "Harry") 
a <- c(1,3,6,8, NA, 5) 
b <- c(3,6,9,1, NA,1) 
c <- c(7,3,1,6,NA,6) 
d <- c(1,4,7,2,NA,8) 
data <- data.frame(Names,a,b,c,d) 

そして、ここでは私の関数は

NAvalues <- function(x,object, y){ 
    object[sample(seq_len(nrow(object)), x, replace = FALSE),-1] <- NA 
    summary(object) 
    y <- data.frame(object) 
} 

だ最初の部分は正常に動作しますが、私はyで指定された名前を持つことになり、新しいオブジェクトを作成するために苦労しています。

NAvalues(2, data, new) 

これを使用すると、newというようなオブジェクトがないというエラーが表示されます。 誰かが私になぜそうだと教えてもらえますか?

+0

にその変数を割り当てることができます

assign(paste(y), data.frame(object), envir = .GlobalEnv) 

です'関数の中に 'y'という名前のオブジェクトを作成しますが、関数の最後には 'y'がなくなります。 「y」パラメータを取り除くだけでなく、関数内から作成したdata.frameを返し、関数の出力を呼び出したいものに割り当てます。だから、あなたは次のような関数を使います。 'new <--Navalues(2、data)' – Dason

+0

これは本当に役に立ちました。ありがとう! – kubafrustrat

+0

ちょうど@Dasonのコメントを展開してください:おそらく、あなたは "new"を "reference by"を渡す行に沿って考えているでしょう(例えば、C++のように/できます)。それはRの仕組みではありません。 R関数の出力( 'return'引数)を新しい変数に代入する必要があります。 –

答えて

0

あなたの仕事の目的は、関数NAvalues()を実行して、引数yで定義されている名前のdata.frameを作成することです。

NAvalues <- function(x,object, y){ 
     object[sample(seq_len(nrow(object)), x, replace = FALSE),-1] <- NA 
     summary(object) 
     assign(paste(y), data.frame(object), envir = .GlobalEnv) 
} 

NAvalues(x = 2, object = data, y = "new") #y must be a character because it is the name of the new data.frame 

解決の鍵は「新しい名前のオブジェクトが存在しないためstringparameteryという名前の変数を作成し、global.environment

+1

で答えを更新しました。 'y = new'は依然として冗長です。関数呼び出しから 'y'変数を削除し、' new <--Navalues(x = 2、object = data) 'と一緒に使用するだけです。 – LAP

+0

@LAPあなたは正しいですが、私は@kubafrustratの質問に答えていました。さらに、 'NAvalues()'関数を使用して、 'global.environment'の' data.frame'を '副作用'として作成したいという印象を受けました。 – Seymour

+0

そうなら、 'y << - data.frame(object)'を指定する必要があり、 'return(y)'は冗長です。現在、 '.globalEnv'内にデータフレームは作成されていません。それでも、新しいオブジェクトに 'new <-Navalues(...)'を手動で割り当てる方が良いでしょう。 – LAP

関連する問題