2

欠落している変数の数に応じて、データ フレームの行を数えたいと思います。たとえば、以下のデータ フレームでは、コードがリストを返すようにします。

3, 5, 1, 1, 0

欠損変数がない 3 行、1 つの欠損変数がある 5 行、2 つの欠損変数がある 1 行、3 つの欠損変数がある 1 行、4 つの欠損変数がある 0 行であるためです。

   v1 v2 v3 v4
1   1  1  1  1
2  NA NA  1  1
3   1  1 NA  1
4   1  1  1  1
5  NA  1  1  1
6  NA  1  1  1
7   1  1  1 NA
8  NA  1  1  1
9   1  1  1  1
10  1 NA NA NA

R にロードできるデータの例を次に示します。

dt <- structure(list(v1 = c(1, NA, 1, 1, NA, NA, 1, NA, 1, 1), v2 = c(1, NA, 1, 1, 1, 1, 1, 1, 1, NA), v3 = c(1, 1, NA, 1, 1, 1, 1, 1, 1, NA), v4 = c(1, 1, 1, 1, 1, 1, NA, 1, 1, NA)), .Names = c("v1", "v2", "v3", "v4"), row.names = c(NA, -10L), class = "data.frame")

データフレームを行ごとにループし、欠落している変数の数に対してカウンターをインクリメントすることでこれを行うことができますが、大きなデータフレームでは非常に遅いので、それを行うための巧妙な方法があることを望んでいました?

4

2 に答える 2

3
table(rowSums(is.na(dt)))
#0 1 2 3 
#3 5 1 1 

最後の 0 (4 秒) が本当に必要な場合NA:

tabulate(factor(rowSums(is.na(dt))), nbins = ncol(dt)+1)
#[1] 3 5 1 1 0
于 2012-11-09T21:08:54.630 に答える
0

これを行うためのよりタイドバース的な方法は次のとおりです。

library(tidyverse)

dt <- structure(list(v1 = c(1, NA, 1 , 1, NA, NA, 1 , NA, 1, 1 ), 
                     v2 = c(1, NA, 1 , 1, 1 , 1 , 1 , 1 , 1, NA), 
                     v3 = c(1, 1 , NA, 1, 1 , 1 , 1 , 1 , 1, NA), 
                     v4 = c(1, 1 , 1 , 1, 1 ,  1, NA, 1 , 1, NA)
                     ),
                 .Names = c("v1", "v2", "v3", "v4"), row.names = c(NA, -10L), class = "data.frame")

dt <- as_tibble(dt)

drop_na() を使用して、tidyverse-y を行う方法

dt %>% 
  drop_na()

「stats」パッケージを使用して「完全なケース/行」のみをフィルタリングします

dt %>% 
  filter(complete.cases(v1, v2, v3, v4))

「na.omit」の使用 (tidyverse 関数ではない)

dt %>% 
  na.omit()
于 2018-09-26T13:20:08.667 に答える