2

我想根据缺少的变量数来计算数据框的行数。因此,例如在下面的数据框中,我希望代码返回列表:

3, 5, 1, 1, 0

因为有 3 行没有缺失变量,5 行有 1 个缺失变量,1 行有 2 个缺失变量,1 行有 3 个缺失变量,0 行有 4 个缺失变量:

   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(四个NAs):

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 回答