3

私は R の初心者です。マニュアルやこの掲示板で多くのことを読みましたが、最初の質問をしなければなりません。ここと少し同じですが、実際には同じではなく、説明がわかりません。
数十万行と 30 列のデータフレームがあります。しかし、私の質問のために、使用できるより単純なデータフレームを作成しました:

a <- sample(c(1,3,5,9), 20, replace = TRUE)
b <- sample(c(1,NA), 20, replace = TRUE)
df <- data.frame(a,b)

ここで、最後の列 (ここでは column b) の値を比較して、次の行と同じ場合に各行の値を繰り返し調べたいと考えています。それが同じであれば、同じ行の新しい列の値として a を書きたいです0。そうでなければ1、新しい列の値として a にする必要があります。

ここで私のコードを見ることができますが、新しい列の行には次のものしか含まれていないため、機能していません0

m<-c()

for (i in seq(along=df[,1])){
    ifelse(df$b[i] == df$b[i+1],m <- 0, m <- 1)          
    df$mov <- m
}

私が取得したい結果は、以下の例のようになります。間違いは何ですか?ループを作成するよりも良い方法はありますか? 私の大きなデータセットでは、ループが非常に遅くなる可能性があります。

   a  b mov
1  9 NA   0
2  1 NA   1
3  1  1   1
4  5 NA   0
5  1 NA   0
6  3 NA   0
7  3 NA   1
8  5  1   0
9  1  1   0
10 3  1   0
11 1  1   0
12 9  1   0
13 1  1   1
14 5 NA   0
15 9 NA   0
16 9 NA   0
17 9 NA   0
18 5 NA   0
19 3 NA   0
20 1 NA   0

ご協力ありがとうございました!

4

3 に答える 3

1

一致するものをマークするために、このようなことを行うことができます

df$bnext <- c(tail(df$b,-1),NA)
df$bnextsame <- ifelse(df$bnext == df$b | (is.na(df$b) & is.na(df$bnext)),0,1)

列にも s がたくさんあり、 との比較では ではなくが返さNAれるため、ここにはs がたくさんあります。それを修正するために a を追加できます。NAbNANATRUE/FALSEdf[is.na(df$bnextsame),"bnextsame"] <- 0

于 2013-11-05T16:39:40.190 に答える
1

あなたの例では、考慮すべき点がいくつかあります。

まず、ループを回避するために、位置を 1 つずらしたベクトルのコピーを作成できます。(これを行うには約 20 の方法があります。)次に vector と testBC実行すると、各位置とその隣接位置の要素ごとの比較が行われます。

次に、等価比較は NA では機能しません。常に NA を返します。そうNA == NAじゃないTRUEですNAか!繰り返しますが、これを回避する方法は約 20 ありますが、ここでNAは、一時的なベクター内のすべての s を、等価性のテストで機能するプレースホルダーに置き換えました。

最後に、最後の値 (隣人を持たない) をどうするかを決める必要があります。これは1、「隣人と一致しない」というあなたの割り当てです。

したがって、 で可能な値の範囲に応じてb、次のことができます。

c = df$b 
z = length(c)
c[is.na(c)] = 'x'   # replace NA with value that will allow equality test
df$mov = c(1 * !(c[1:z-1] == c[2:z]),1)     # add 1 to the end for the last value
于 2013-11-05T16:52:25.777 に答える
0

zooで「ローリング等値テスト」を使用できますrollapply。また、 よりidenticalも を優先し==ます。

#identical(NA, NA)
#[1] TRUE
#NA == NA
#[1] NA

library(zoo)

df$mov <- c(rollapply(df$b, width = 2, 
        FUN = function(x) as.numeric(!identical(x[1], x[2]))), "no_comparison")
      #`!` because you want `0` as `TRUE` ;
      #I added a "no_comparison" to last value as it is not compared with any one
df
#   a  b           mov
#1  5  1             0
#2  1  1             0
#3  9  1             1
#4  5 NA             1
#5  9  1             1
#.....
#19 1 NA             0
#20 1 NA no_comparison
于 2013-11-05T18:08:27.487 に答える