112

dplyr を使用して完全なケースの data.frame をフィルタリングすることは可能ですか? complete.casesもちろん、すべての変数のリストで動作します。しかし、それは a) 変数が多い場合は冗長であり、b) 変数名が不明な場合 (たとえば、任意の data.frame を処理する関数内) は不可能です。

library(dplyr)
df = data.frame(
    x1 = c(1,2,3,NA),
    x2 = c(1,2,NA,5)
)

df %.%
  filter(complete.cases(x1,x2))
4

7 に答える 7

27

これは私のために働く:

df %>%
  filter(complete.cases(df))    

またはもう少し一般的に:

library(dplyr) # 0.4
df %>% filter(complete.cases(.))

これには、フィルターに渡す前にチェーン内でデータを変更できるという利点があります。

より多くの列を持つ別のベンチマーク:

set.seed(123)
x <- sample(1e5,1e5*26, replace = TRUE)
x[sample(seq_along(x), 1e3)] <- NA
df <- as.data.frame(matrix(x, ncol = 26))
library(microbenchmark)
microbenchmark(
  na.omit = {df %>% na.omit},
  filter.anonymous = {df %>% (function(x) filter(x, complete.cases(x)))},
  rowSums = {df %>% filter(rowSums(is.na(.)) == 0L)},
  filter = {df %>% filter(complete.cases(.))},
  times = 20L,
  unit = "relative")

#Unit: relative
#             expr       min        lq    median         uq       max neval
 #         na.omit 12.252048 11.248707 11.327005 11.0623422 12.823233    20
 #filter.anonymous  1.149305  1.022891  1.013779  0.9948659  4.668691    20
 #         rowSums  2.281002  2.377807  2.420615  2.3467519  5.223077    20
 #          filter  1.000000  1.000000  1.000000  1.0000000  1.000000    20
于 2014-05-13T11:04:43.687 に答える
7

これを試して

df[complete.cases(df),] #output to console

またはこれでも

df.complete <- df[complete.cases(df),] #assign to a new data.frame

上記のコマンドは、data.frame 内のすべての列 (変数) の完全性をチェックします。

于 2014-03-12T13:59:22.117 に答える
1

dplyr >= 1.0.4

if_anyif_allの新しいバージョンでは、関数に似た構文dplyrを適用することができます。これは、データフレームに完全なケースとは見なされない他の変数がある場合に役立ちます。たとえば、「x」で始まる列の欠落していない行のみが必要な場合:acrossfilter

library(dplyr)
df = data.frame(
  x1 = c(1,2,3,NA),
  x2 = c(1,2,NA,5),
  y = c(NA, "A", "B", "C")
)

df %>% 
  dplyr::filter(if_all(starts_with("x"), ~!is.na(.)))

  x1 x2    y
1  1  1 <NA>
2  2  2    A

これらの機能の詳細については、このリンクを参照してください。

于 2021-02-08T21:48:52.927 に答える