4

10 個の異なる列がdata.frameあります (各列の長さは同じです)。NA' ' が列の長さの 15% を超えている列を削除したいと考えています。

NA最初に各列のパーセンテージを計算する関数を作成してから、関数data.frameを適用する別の関数を作成する必要がありますか? これを行う最善の方法は何ですか?

4

2 に答える 2

10

まず、サンプルデータを共有することは常に良いことです。実際のデータである必要はありません。構成されたもので問題ありません。

set.seed(1)
x <- rnorm(1000)
x[sample(1000, 150)] <- NA
mydf <- data.frame(matrix(x, ncol = 10))

次に、組み込み関数を使用して必要なものを取得できます。ここでis.na(mydf)は、論理チェックを実行し、とをdata.frame返しTRUEますFALSETRUEFALSEはとに等しい1ので、(is )値の数の平均を取得するために0使用できます。次に、あなたの規定に従ってチェックすることができます。この場合、どの列が15%を超える値を持っていますか?colMeansTRUENANA

colMeans(is.na(mydf)) > .15
#    X1    X2    X3    X4    X5    X6    X7    X8    X9   X10 
#  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE

ご覧のとおり、X1、X2、X6、X8、およびX9を削除する必要があります。繰り返しますが、論理ベクトルを利用して、次のようにします。

> final <- mydf[, colMeans(is.na(mydf)) <= .15]
> dim(final)
[1] 100   5
> names(final)
[1] "X3"  "X4"  "X5"  "X7"  "X10"
于 2013-03-21T17:25:45.193 に答える
0

あなたはそのようにdata.tableでそれを行うことができます

data.table にデータをロードします。DTと呼んでください。列 2 から 4 までが数値だとします。

Theta = 0.15
Drop <- DT[, lapply(.SD, function (x) {sum(is.na(x))/length(x) > Theta} ), .SDcols = 2:4]
Cols.2.Drop <- names(Drop)[which(Drop==TRUE)]
DT[, (Cols.2.Drop) := NULL]

ここのデータでテスト済み:

Obs Var1    Var2    Var3
A0001   21  21  21
A0002   21  78  321
A0003   32  98  87
A0004   21  12  54
A0005   21  13  45
A0006   21  87  45
B0007   84  NA  45
B0008   21  NA  98
B0009   2   NA  45
B0010   12  NA  45
于 2016-09-15T10:39:47.853 に答える