2017-02-23 3 views
2

したがって、調査の複数の管理の問題に対処するための調査データがあります)。私は例のX1とX2を持っていると言う、そのために、同じ人物によって行われ、私は私がX1で最初のNAを特定したい、x1は最初に発生した知ることができることを考えるとベクトルの場合、すべての値がNA(または何らかの値)である過去のインデックスを決定します

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

(ここでは、すでにベクトルとして引き出さ)それ以降のすべてのエントリはNA(36桁)なので、ケースを組み合わせて第1インプレッションのみを表すデータを生成することができます。

私はこれを行うために私を可能にする機能を見つけるしたいと思います:

に相当、ここで出力が得られ
n <- {function that computes this value} 
x <- c(x1[1:(n-1)], x2[n:length(x2)]) 

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

length(na.omit(x1)) + 1のようなアプローチがあるとして、動作しません。終了点の前に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

申し訳ありませんが、これはちょうど私が述べたように目標ではない最初のNAを、見つけました。 x1が0の場合は、 x1 < - c(1:25、NA、27:35、rep(NA、65)) などとは全く違った動作をします。そして、head()を長くすると、うまくいきません - 任意の長さのNA(ある点から最後まで)が必要です。 – Joe

+0

@ジョーあなたのクエリでこれを書いた '私はx1が最初に発生したことを知ることができるとすれば、それ以降のすべてのエントリがNA(位置36)であるx1の最初のNAを特定したいので、最初の印象のみ。 'あなたの' sample output'も現在のクエリを反映していません。あなたの 'サンプル出力 'を更新してください。 – Zico

+0

私は自分のsolnが動作しているのを見ることができます – 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 

もう一つの例:rleとして

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

ランレングス符号化を使用して

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の最後の有効なエントリの前にNAを持たない場合に機能します。この場合、前のNAはユーザーが質問をスキップしたことを意味する可能性があります。あなたがX1内の前のNASに保存しておきたい場合は、操作を行います。

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を特定したい"ビット – SymbolixAU

+0

ユーザーが質問をスキップすることができる場合(有効回答間のナース)、方法最後の有効な入力後にユーザーが1つ以上の回答をスキップしなかったことを知っていますか? –

関連する問題