3

データ フレームから、各行に「NA」(またはカスタム値) である列の数と、上にn行、下にm行を与えるベクトルを作成するにはどうすればよいでしょうか。

したがって、m = n = 1 (つまり、各行のいくつの列が NA で、直前と直後に NA を持つ) の場合、私のデータフレームは

structure(list(X = 1:8, A = c(3L, NA, 10L, NA, 6L, NA, 5L, NA
), B = c(6L, NA, NA, NA, 8L, NA, 13L, NA), C = c(NA, 12L, 14L,  
NA, NA, NA, 9L, NA), D = c(NA, NA, NA, NA, NA, 11L, 7L, NA)), .Names = c("X", 
"A", "B", "C", "D"), class = "data.frame", row.names = c(NA, 
-8L))

すなわち

 t X  A  B  C  D
1 1  3  6 NA NA 
2 2 NA NA 12 NA 
3 3 10 NA 14 NA 
4 4 NA NA NA NA
5 5  6  8 NA NA
6 6 NA NA NA 11
7 7  5 13  9  7
8 8 NA NA NA NA

ベクトルが欲しい

count
0
1
2
1
1
0
0
0

(最初と最後のエントリがNA's の場合は問題ありません)。COUNTIFSExcel の関数、つまりCOUNTIFS(B2:F2,"",B3:F3,"",B4:F4,"")行 3 を模倣しようとしています。

4

5 に答える 5

3

これにより、望ましい結果が得られるはずです-

y = is.na(yourDataFrame)

rowSums(y & rbind(rep(F,5), y[-nrow(yourDataFrame),]) & rbind(y[-1,], rep(F,5)))
于 2013-04-09T05:57:04.330 に答える
2

私はあなたが意味することを理解すると思います。

データフレームが と呼ばれるとしxます。

まず、 の各 ( row, column)について、そのセルにxがあるかどうか、AND が前の行と後の行の同じ列にあるかどうかを確認する必要があります。NANAnm

まず、単一の行、行の場合にこれを行いましょうi = 2n = 1andもありますm = 1(質問の例から)。

i <- 2
n <- 1
m <- 1

i - n行をi + m含む各列の NA の数を数えましょう(現在の値が NA の場合はis.na戻り、列の合計を返します)TRUEcolSums

y <- colSums(is.na(x[(i - n):(i + m), ]))
# X A B C D 
# 0 1 2 1 3 

これでNA、3 をカウントした場合、前、現在、および次の行にのみ がありNAます (つまり、列 D のみがここで適格です)。

y == n + m + 1
#     X     A     B     C     D 
# FALSE FALSE FALSE FALSE  TRUE

したがって、基準を満たす列の(したがって、i出力の th 要素) は次のとおりです。

sum(y == n + m + 1)
# 1 

sapply次に、これを各行に適用するために使用できます。

countifs <- function (df, n, m) {
    sapply(1:nrow(df),
           function (i) {
               nrows <- nrow(df)
               startRow <- max(i - n, 1)
               endRow   <- min(i + m, nrows)
               y <- colSums(is.na(x[startRow:endRow, ]))
               sum(y == n + m + 1)
           })
}

countifs(x, 1, 1)
# [1] 0 1 2 1 1 0 0 0

また、 ではなくカスタム値と比較したい場合があると述べましたNA。その場合、 を実行する代わりにis.na(x[...])、実行できますx[...] == value(ただし、 を使用する場合valueは実行できません) 。NAis.na

sapplyまた、 on rows n + 1toのみを使用しnrow(df) - m - 1、最初nと最後のm要素を自動的に 0 に設定することで、少しの作業を節約できます。

于 2013-04-09T05:55:30.870 に答える
1

describe各列の NA の数を取得するためだけに使用できます。

describe(traindata)

出力は次のようになります。

Column_3 
      n missing  unique    Mean     .05     .10     .25     .50     .75     .90     .95 
    646      23     283  0.2792  0.0000  0.0000  0.0000  0.1455  0.4798  0.9305  1.0000 

値を確認しmissingます。

于 2013-04-09T05:30:21.630 に答える
1

ベクトル化されたバージョンを思いつくことができなかったので、古き良き for ループを使用したものを次に示します。

x <- structure(list(X = 1:8, A = c(3L, NA, 10L, NA, 6L, NA, 5L, NA
), B = c(6L, NA, NA, NA, 8L, NA, 13L, NA), C = c(NA, 12L, 14L,  
NA, NA, NA, 9L, NA), D = c(NA, NA, NA, NA, NA, 11L, 7L, NA)), .Names = c("X", 
"A", "B", "C", "D"), class = "data.frame", row.names = c(NA, 
-8L))

y <- x
y[is.na(y)] <- -99
out <- vector("numeric", nrow(y))

n <- 1
m <- 1
for (c in (1+n):(nrow(y)-m)) {
    out[c] <- sum((y[(c-n),] == -99) & (y[(c),] == -99) & (y[(c+m),] == -99))
}
out

これでうまくいくはずです(nとmを許可しても):

> out
[1] 0 1 2 1 1 0 0 0

2 つのトリックを使用することに注意してください。s での作業NAは問題があるため、それらを交換します-99(ただし、完全に必要というわけではありません)。次に、最初の n 行と最後の m 行をループしません。

誰かがベクトル化されたバージョンを思いついた場合、彼/彼女は間違いなく私の支持を得ます。

于 2013-04-09T05:51:32.180 に答える