2017-04-06 10 views
0

forループを使用すると、データセットの各行の2つの値を無作為にNAで置き換えることができます(この値のインデックスはランダムに変化します各行で)。
私はapply()を使ってまったく同じことをしたいと思います。
私は(どこでもNAを返す他の多くのもののように)このコードを試してみました:(それは初期データセットへの変更は行いません)R値のインデックスを必要とするループの代わりにApply()関数

my_fun<-function(x){if (j %in% sample(1:ncol(y),2)) {x[j]<-NA}} 
apply(y,1,my_fun) 

しかし、それは動作しません。
問題は、オブジェクトjが見つかりません。 jは列の番号でなければなりません。 誰かがアイデアを持っていますか?私はあなたがしたいと主張しているあなたの説明から、

+0

あなたの関数から 'X'を返すことがあります。関数の呼び出しでは、引数は** **呼び出しによって関数に渡されます** – jogo

+0

ありがとうございますが、ここではオブジェクトjが見つからないということです –

+0

'y'はどのオブジェクトですか?あなたのデータを表示するには 'dput()'を使ってください! 'y'が行列(またはdata.frame)の場合、' apply(y、1、my_fun) 'は関数' my_fun'に行単位で送信します。だからあなたの関数 'my_fun'では、オブジェクト' x'はベクトル(すなわち 'y'からの1つの行)です。 – jogo

答えて

0

my_fun <- function(x) { x[sample(1:length(x), 2)] <- NA; x } 
apply(y, 1, my_fun) # or 
t(apply(y, 1, my_fun)) 

テスト機能:

set.seed(42) 
y <- matrix(1:60, 10) 
y 
t(apply(y, 1, my_fun)) 
# > t(apply(y, 1, my_fun)) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 1 11 21 31 NA NA 
# [2,] 2 NA 22 32 NA 52 
# [3,] 3 13 NA NA 43 53 
# [4,] NA 14 24 34 NA 54 
# [5,] 5 15 25 NA 45 NA 
# [6,] 6 16 NA NA 46 56 
# [7,] 7 NA 27 37 47 NA 
# [8,] 8 18 NA 38 NA 58 
# [9,] NA 19 29 39 49 NA 
# [10,] 10 20 NA 40 50 NA 
+0

はい、ありがとうございます! –

+0

しかし、私の変数の1つが文字の型であるため、関数applyを使用した後、すべての数値の文字型が変更され、元の型を維持する必要があります... –

+0

y is文字列と数値列を持つデータフレームと、列の種類が何であれランダムなNAを持たせたい –

関連する問題