2012-04-02 8 views
4

私は各行から単一のランダムサンプルを取ってみたいというRの行列を持っています。私のデータの一部はNAにありますが、ランダムサンプルを取るときには、NAをサンプリングのオプションにしたくありません。どうすればこれを達成できますか?例えばサンプル関数の値またはNAsを無視する

a <- matrix (c(rep(5, 10), rep(10, 10), rep(NA, 5)), ncol=5, nrow=5) 
a 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 5 5 10 10 NA 
[2,] 5 5 10 10 NA 
[3,] 5 5 10 10 NA 
[4,] 5 5 10 10 NA 
[5,] 5 5 10 10 NA 

私は出力にこの行列に私は

b <- matrix(apply(a, 1, sample, size=1), ncol=1) 
b 

    [,1] 
[1,] NA 
[2,] NA 
[3,] 10 
[4,] 10 
[5,] 5 

代わりに、私はNAが出力可能なことをしたくない得る別のマトリックスをサンプル関数を適用出力を次のようにしたいとします:

b 
    [,1] 
[1,] 10 
[2,] 10 
[3,] 10 
[4,] 5 
[5,] 10 

答えて

8

もっと良い方法があるかもしれませんが、サンプルはあまり好きではありませんrにはNAsに関連するパラメータがあるので、代わりにNAsに対処するための無名関数を書きました。

apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)}) 

は基本的にあなたが望むことをします。あなたが本当に行列出力が必要な場合は、

b <- matrix(apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)}), ncol = 1) 

編集を行うことができ:あなたはこのために要求していないが、私の提案された解決策は、行がONLYのNA含まれている主場合(特定のケースで失敗しない

a <- matrix (c(rep(5, 10), rep(10, 10), rep(NA, 5)), ncol=5, nrow=5) 
# My solution works fine with your example data 
apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)}) 

# What happens if a row contains only NAs 
a[1,] <- NA 

# Now it doesn't work 
apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)}) 

# We can rewrite the function to deal with that case 
mysample <- function(x, ...){ 
    if(all(is.na(x))){ 
     return(NA) 
    } 
    return(sample(x[!is.na(x)], ...)) 
} 

# Using the new function things work. 
apply(a, 1, mysample, size = 1) 
+0

はい、私はその障害に気付きました。私はこれからサンプルを取り出し、より多くのサンプルを取るより多くの複製を生成するためにそれを使用します。私は回避策を講じましたが、あなたのソリューションは私より優れています。 – Kevin

3

Dasonのソリューションは非常にうまく機能@私は思いますが、あなたもこれを試すことができます:「

a <- matrix (c(rep(5, 10), rep(10, 10), rep(NA, 5)), ncol=5, nrow=5) 
matrix(sample(na.omit(as.numeric(a)),ncol(a))) 
    [,1] 
[1,] 10 
[2,] 5 
[3,] 10 
[4,] 10 
[5,] 5 

完全な行がNAであったとしてもSまたはNA'Sとの完全なコラム、この解決策は、例えば、完全に対処することができます

set.seed(007) 
a <- matrix(sample(1:100, 25), 5) 
a[1,] <- NA 
a[5,1] <- NA 
a[,3] <- NA 
a[5,5] <- NA 
a[3,2] <- NA 

matrix(sample(na.omit(as.numeric(a)),ncol(a))) 
    [,1] 
[1,] 40 
[2,] 1 
[3,] 42 
[4,] 26 
[5,] 32 

を、私は、これはあなたが(少なくともこれは別のアプローチすることができる)を探していたものであると思います。

関連する問題