2017-02-23 8 views
2

그래서 설문 조사의 여러 번 관리 문제를 해결하고자하는 설문 조사 데이터가 있습니다. 컴퓨터가 고장 났으며 브라우저가 닫히고 사람들이 다시 시작되었습니다.). 나는 사례 X1과 X2가 있다고 가정 해, 순서에 같은 사람에 의해 수행 내가 X1의 첫 번째 NA를 확인하려면, X1이 처음 발생한 알 수있는 점을 감안벡터의 경우 모든 값이 NA (또는 일부 값) 인 과거 색인을 결정하십시오.

x1 <- c(1:35, rep(NA, 65)) 
x2 <- c(-1:-95, rep(NA, 5)) 

(여기서, 이미 벡터로 뽑아) 그 이후의 모든 엔트리는 NA (36 번째 위치)이므로 사례를 결합하여 첫 번째 노출 만 나타내는 데이터를 생성 할 수 있습니다.

나는이 할 날 수 있도록 할 함수 찾으려면 : 여기에 해당하는 출력 결과

n <- {function that computes this value} 
x <- c(x1[1:(n-1)], x2[n:length(x2)]) 

을 :로, 작동하지 않습니다 length(na.omit(x1)) + 1 같은

c(1:35, -36:-95, rep(NA, 5)) 

접근이 끝점 이전에 NA가되어 색인 생성을 방해 할 수 있습니다. 예를 들어, 아직이 NA의만을위한 작업을 필요로하는 인덱스 (36)의 경우

x1 <- c(1:12, NA, 13:35, rep(NA, 65)) 

97 %를 찾을 필요하지만 일반적인 솔루션도 좋은 것 (즉, 또한 "일치"또는 뭔가 수있는 일 비슷한 경우).

답변

0

거의 혼자서 쿼리를 해결했습니다. 시도해주세요

x3 <- c(x1[1:(head(which(is.na(x1)),1) - 1)], x2[head(which(is.na(x1)),1):length(x2)]) 

당신이 기능으로 변환 할 수 있기를 바랍니다. 귀하의 질문에서

+0

죄송합니다,하지만 이것은 단지 내가 언급 한 바와 같이, 제 1 NA를 발견 목표 아니다. x1이 0이라면 x1 <- c (1:25, NA, 27:35, rep (NA, 65)) 등이 완전히 다르게 작동합니다. 그리고 head()를 더 길게 만드는 것은 작동하지 않을 것입니다. - 임의의 길이의 NA가 필요합니다 (어느 시점에서 끝까지). – Joe

+0

@Joe가 당신의 쿼리에서 이것을 썼습니다. x1이 처음 발생했다는 것을 알았을 때, 모든 추가 항목이 NA (위치 36) 인 x1의 첫 번째 NA를 식별하기 위해 사례를 결합하여 데이터를 생성 할 수 있습니다 첫인상 만. '또한 '샘플 출력'에 현재 쿼리가 반영되지 않습니다. '샘플 출력 '을 업데이트 해 주시겠습니까 – Zico

+0

제 솔트가 작동하는 것을 볼 수 있습니다 – Zico

1

데이터

x1 <- c(1:35, rep(NA, 65)) 
x2 <- c(-1:-95, rep(NA, 5)) 
n <- max(which(diff(is.na(x1)) == 1)) 
c(x1[1:n-1], x2[n:length(x2)]) 

# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
# [24] 24 25 26 27 28 29 30 31 32 33 34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 
# [47] -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 
# [70] -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 
# [93] -93 -94 -95 NA NA NA NA NA 

또 다른 예 : 실행 길이 인코딩을 사용하여

x1 <- c(1:35, rep(NA, 35), 1:20, rep(NA, 10)) 
x2 <- c(-1:-95, rep(NA, 5)) 
n <- max(which(diff(is.na(x1)) == 1)) 
c(x1[1:n-1], x2[n:length(x2)]) 
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
# [24] 24 25 26 27 28 29 30 31 32 33 34 35 NA NA NA NA NA NA NA NA NA NA NA 
# [47] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
# [70] NA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 -90 -91 -92 
# [93] -93 -94 -95 NA NA NA NA NA 
+0

기본 기능들을 똑똑하게 연결하고 있습니다. +1, 그리고 어쩌면 상을받을 수 있습니다. 다른 해결책이 있는지를보기 위해 잠시 열어 두겠습니다. – Joe

+0

@Joe - 이것이 당신이 요구 한 출력과 어떻게 일치하는지 모르겠습니다. – SymbolixAU

+0

. @ 조 원래 쿼리를 업데이 트하십시오. 지금은 약간 혼란 스럽습니다. – Zico

1

rle

n <- with(rle(is.na(x1)), lengths[length(lengths) -1 ] + 1) 

x <- c(x1[1:(n-1)], x2[n:length(x2)]) 

# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 
# [30] 30 31 32 33 34 35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 
# [59] -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 
# [88] -88 -89 -90 -91 -92 -93 -94 -95 NA NA NA NA NA 

는 실행의 길이를 제공합니다 NA (또는 지정한 내용). 그리고, 이러한 실행의 마지막을 사용하려면, 그래서 우리는 이것은 매우 간단한 ifelse으로 해결 될 수

> rle(is.na(x1)) 
Run Length Encoding 
    lengths: int [1:2] 35 65 
    values : logi [1:2] FALSE TRUE 
0

마지막 실행의 출발점 선택할 수 있습니다 :

x3 = ifelse(is.na(x1),x2,x1) 

결과 :

> x3 
    [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 
[14] 14 15 16 17 18 19 20 21 22 23 24 25 26 
[27] 27 28 29 30 31 32 33 34 35 -36 -37 -38 -39 
[40] -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 
[53] -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 
[66] -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 
[79] -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 
[92] -92 -93 -94 -95 NA NA NA NA NA 

x1의 마지막 유효 항목 앞에 NAs가 없으면 작동합니다. 이 경우 이전 NA는 사용자가 질문을 건너 뛰었다는 것을 의미 할 수 있습니다.당신이 1 개 내부 이전의 NA를 유지하려면 할 경우

lastValidX1 = max(which(!is.na(x1))) 
x3 = c(x1[1:lastValidX1] , x2[(lastValidX1+1):length(x2)]) 

예 :

x1 <- c(1:19,NA,21:35, rep(NA, 65)) 
x2 <- c(-1:-95, rep(NA, 5)) 

lastValidX1 = max(which(!is.na(x1))) 
x3 = c(x1[1:lastValidX1] , x2[(lastValidX1+1):length(x2)]) 

> x3 
    [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 
[14] 14 15 16 17 18 19 NA 21 22 23 24 25 26 
[27] 27 28 29 30 31 32 33 34 35 -36 -37 -38 -39 
[40] -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 
[53] -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 
[66] -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 
[79] -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 
[92] -92 -93 -94 -95 NA NA NA NA NA 

> lastValidX1 
[1] 35 
+0

"모든 추가 항목이 NA (포지션 36) 인 과거 x1에서 첫 번째 NA를 식별하고 싶습니다."bit – SymbolixAU

+0

사용자가 질문을 건너 뛰는 것이 허용되면 마지막 유효 항목 이후 사용자가 하나 이상의 답변을 건너 뛰지 않았다는 것을 알고 있습니까? –