2012-04-02 1 views
4

각 행에서 하나의 무작위 샘플을 가져 가고 싶습니다. 내 데이터 중 일부는 NA에 있지만 무작위 샘플을 가져 오는 경우 NA를 샘플링 옵션으로 사용하지 않으려합니다. 나는 어떻게 이것을 성취 할 것인가? I는 출력이 행렬에 다른 매트릭스 샘플 함수를 적용하면샘플 함수에서 값 또는 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 

가 I 대신 I는 NA가 출력되는 것을 가능하게하고 싶지 않은

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

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

얻을 예

, 다음과 같은 출력을 원합니다.

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) 

편집을 할 수있는 : 당신이 요청하지 않았다하지만 내 제안 된 솔루션이 행이 만의 NA 포함 주로 경우 (어떤 경우에 실패하는

. 내가 Dason의 솔루션 @ 생각
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

아주 잘 작동하지만, 당신이 시도 할 수 있습니다 :

완전한 행은 'NA와 함께있는 경우에도
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 

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 

나는 이것이 당신이 (적어도이 또 다른 방법이 될 수있다) 찾고 있던 것 같아요.