【问题标题】:The Number of Rows with a Specific Number of Missing Values具有特定数量缺失值的行数
【发布时间】:2016-09-26 14:53:25
【问题描述】:

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

 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 的变体,但无法让它们中的任何一个工作。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以在逻辑矩阵(is.na(df))上使用rowSums,并检查NA的数量是否等于感兴趣的值。

    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 非常快,但如果是大型数据集,那么创建逻辑矩阵也会在内存中产生问题。因此,我们可以在遍历数据集的列(lapply(df, is.na))之后使用Reduce

    sum(Reduce(`+`, lapply(df, is.na))==1)
    #[1] 2
    
    f2 <- function(dat, n){
          sum(Reduce(`+`, lapply(dat, is.na))==n)
     }
    
    f2(df, 1)
    

    【讨论】:

      【解决方案2】:

      试试这个:

      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
      

      【讨论】:

      • 您正在以低效的方式重新发明轮子。 R 将所有这些函数矢量化
      • 是的,如果关注效率@David,我们可以使用 akrun 的 rowSums / Reduce。
      猜你喜欢
      • 1970-01-01
      • 2019-09-04
      • 2018-11-25
      • 2020-02-29
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2017-05-25
      • 2014-06-03
      相关资源
      最近更新 更多