181

データ フレームに問題があり、その問題を自分で実際に解決できませんでした。データ フレームには列として任意のプロパティがあり、各行1 つの
データセットを表します。

問題は、すべての行の値が NAである列を削除
する方法です。

4

13 に答える 13

186

これを試して:

df <- df[,colSums(is.na(df))<nrow(df)]
于 2010-04-15T09:12:55.850 に答える
118

is.na(df)これまでに提供された 2 つのアプローチは、(他のメモリの問題の中でも)と同じサイズのオブジェクトになるを作成するため、大きなデータ セットでは失敗しますdf

メモリと時間の効率を高める 2 つのアプローチを次に示します。

を使用したアプローチFilter

Filter(function(x)!all(is.na(x)), df)

およびdata.tableを使用したアプローチ(一般的な時間とメモリ効率のため)

library(data.table)
DT <- as.data.table(df)
DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]

大きなデータを使用した例 (30 列、1e6 行)

big_data <- replicate(10, data.frame(rep(NA, 1e6), sample(c(1:8,NA),1e6,T), sample(250,1e6,T)),simplify=F)
bd <- do.call(data.frame,big_data)
names(bd) <- paste0('X',seq_len(30))
DT <- as.data.table(bd)

system.time({df1 <- bd[,colSums(is.na(bd) < nrow(bd))]})
# error -- can't allocate vector of size ...
system.time({df2 <- bd[, !apply(is.na(bd), 2, all)]})
# error -- can't allocate vector of size ...
system.time({df3 <- Filter(function(x)!all(is.na(x)), bd)})
## user  system elapsed 
## 0.26    0.03    0.29 
system.time({DT1 <- DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]})
## user  system elapsed 
## 0.14    0.03    0.18 
于 2012-09-27T05:36:40.773 に答える
15

別の方法は、apply()関数を使用することです。

data.frame がある場合

df <- data.frame (var1 = c(1:7,NA),
                  var2 = c(1,2,1,3,4,NA,NA,9),
                  var3 = c(NA)
                  )

次に、どの列が条件を満たしているかを確認するために使用できるため、アプローチapply()のみを使用して、Musa による回答と同じサブセット化を簡単に行うことができます。apply

> !apply (is.na(df), 2, all)
 var1  var2  var3 
 TRUE  TRUE FALSE 

> df[, !apply(is.na(df), 2, all)]
  var1 var2
1    1    1
2    2    2
3    3    1
4    4    3
5    5    4
6    6   NA
7    7   NA
8   NA    9
于 2010-04-15T12:36:30.353 に答える
1

これも役立つことを願っています。1 つのコマンドにすることもできますが、2 つのコマンドに分割すると読みやすくなりました。次の命令で関数を作成し、非常に高速に動作しました。

naColsRemoval = function (DataTable) { na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )] DataTable [ , unlist (na.cols) := NULL , with = F] }

.SD は、必要に応じて検証をテーブルの一部に制限することを許可しますが、テーブル全体を

于 2015-07-21T12:57:44.650 に答える