想象一下像下面那样的小数据集,由三个变量组成:
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的变体,但无法让它们中的任何一个起作用。
谢谢!
答案 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