具有特定缺失值数的行数

时间:2016-09-26 06:37:25

标签: r

想象一下像下面那样的小数据集,由三个变量组成:

 v1 <- c(0, 1, NA, 1, NA, 0)
 v2 <- c(0, 0, NA, 1, NA, NA)
 v3 <- c(1, NA, 0, 0, NA, 0)
 df <- data.frame(v1, v2, v3)

 df
   v1 v2 v3
 1  0  0  1
 2  1  0 NA
 3 NA NA  0
 4  1  1  0
 5 NA NA NA
 6  0 NA  0

可以使用is.na命令如下计算至少有一个缺失值的行数 - 而R将返回4:

sum(is.na(df$v1) | is.na(df$v2) | is.na(df$v3))

或者缺少所有三个值的行数 - 并且R将返回1:

sum(is.na(df$v1) & is.na(df$v2) & is.na(df$v3))

此时有两个问题:

(1)如何计算缺少“恰好一个”或“正好两个”值的行数?

(2)如果我要在大型数据集中执行上述操作,如何将计算范围限制为v1,v2和v3(即无需创建子集)?

我尝试过is.na,nrow和df的变体,但无法让它们中的任何一个起作用。

谢谢!

2 个答案:

答案 0 :(得分:3)

我们可以在逻辑矩阵(<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay" /> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_height="match_parent" /> </android.support.design.widget.CoordinatorLayout> )上使用rowSums,并检查NA的数量是否等于感兴趣的值。

is.na(df)

为了更容易,创建一个功能来执行此操作

n1 <- 1
sum(rowSums(is.na(df))==n1)

注意:f1 <- function(dat, n){ sum(rowSums(is.na(dat)) == n) } f1(df, 0) #[1] 2 f1(df, 1) #[1] 2 f1(df, 3) #[1] 1 f1(df, 2) #[1] 1 非常快,但如果它是一个大型数据集,那么创建逻辑矩阵也会在内存中产生问题。因此,我们可以在循环遍历数据集的列(rowSums)之后使用Reduce

lapply(df, is.na)

答案 1 :(得分:1)

试试这个:

num.rows.with.x.NA <- function(df, x, cols=names(df)) {
   return(sum(apply(df, 1, function(y) sum(is.na(y[cols])) == x)))
}

df

  v1 v2 v3
1  0  0  1
2  1  0 NA
3 NA NA  0
4  1  1  0
5 NA NA NA
6  0 NA  0

num.rows.with.x.NA(df, 0, names(df))
#[1] 2
num.rows.with.x.NA(df, 1, names(df))
#[1] 2
num.rows.with.x.NA(df, 2, names(df))
#[1] 1
num.rows.with.x.NA(df, 3, names(df))
#[1] 1