10 個の異なる列がdata.frame
あります (各列の長さは同じです)。NA
' ' が列の長さの 15% を超えている列を削除したいと考えています。
NA
最初に各列のパーセンテージを計算する関数を作成してから、関数data.frame
を適用する別の関数を作成する必要がありますか? これを行う最善の方法は何ですか?
まず、サンプルデータを共有することは常に良いことです。実際のデータである必要はありません。構成されたもので問題ありません。
set.seed(1)
x <- rnorm(1000)
x[sample(1000, 150)] <- NA
mydf <- data.frame(matrix(x, ncol = 10))
次に、組み込み関数を使用して必要なものを取得できます。ここでis.na(mydf)
は、論理チェックを実行し、とをdata.frame
返しTRUE
ますFALSE
。TRUE
とFALSE
はとに等しい1
ので、(is )値の数の平均を取得するために0
使用できます。次に、あなたの規定に従ってチェックすることができます。この場合、どの列が15%を超える値を持っていますか?colMeans
TRUE
NA
NA
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"
あなたはそのように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