【问题标题】:retrieving number of observations with non missing values检索具有非缺失值的观察数
【发布时间】:2017-12-08 18:14:27
【问题描述】:

我想计算具有非缺失值的观察值(以下示例中的人)的数量。

unbal <- data.frame(PERSON=c(rep('Frank',5),rep('Tony',5),rep('Edward',5)), YEAR=c(2001,2002,2003,2004,2005,2001,2002,2003,2004,2005,2001,2002,2003,2004,2005), Y=c(21,22,23,24,25,5,6,NA,7,8,31,32,33,34,35), X=c(1:15))
unbal

   PERSON YEAR  Y  X
1   Frank 2001 21  1
2   Frank 2002 22  2
3   Frank 2003 23  3
4   Frank 2004 24  4
5   Frank 2005 25  5
6    Tony 2001  5  6
7    Tony 2002  6  7
8    Tony 2003 NA  8
9    Tony 2004  7  9
10   Tony 2005  8 10
11 Edward 2001 31 11
12 Edward 2002 32 12
13 Edward 2003 33 13
14 Edward 2004 34 14
15 Edward 2005 35 15

在这种情况下将为 2,因为只有两个人(弗兰克和爱德华)拥有所有数据。

【问题讨论】:

    标签: r panel


    【解决方案1】:

    我们可以使用anyNA,它可以和by一起对data.frames进行操作。前置 ! 运算符会否定结果以返回所需的值。

    使用by

    !by(unbal, unbal["PERSON"], FUN=anyNA)
    PERSON: Edward
    [1] TRUE
    ---------------------------------------------------------------------------------- 
    PERSON: Frank
    [1] TRUE
    ---------------------------------------------------------------------------------- 
    PERSON: Tony
    [1] FALSE
    

    或者要返回一个命名向量,将它包装在c中。

    !c(by(unbal, unbal["PERSON"], FUN=anyNA))
    Edward  Frank   Tony 
      TRUE   TRUE  FALSE 
    

    要计算没有缺失值的人数,请将其包装在 sum

    sum(!c(by(unbal, unbal["PERSON"], FUN=anyNA)))
    [1] 2
    

    sotos方法的修改,我们可以像这样使用anyNA

    !sapply(split(unbal, unbal$PERSON), anyNA)
    Edward  Frank   Tony 
      TRUE   TRUE  FALSE
    

    【讨论】:

      【解决方案2】:

      我们可以使用data.table

      library(data.table)
      setDT(unbal)[, .(ind = all(complete.cases(.SD))), PERSON]
      

      如果我们需要“PERSON”,只需提取它

      setDT(unbal)[, .(ind = all(complete.cases(.SD))), PERSON][(ind), PERSON]
      #[1] Frank  Edward
      

      如果我们需要总数

      setDT(unbal)[, .(ind = all(complete.cases(.SD))), PERSON][, sum(ind)]
      #[1] 2
      

      【讨论】:

        【解决方案3】:

        通过base R的一种方式,

        sapply(split(unbal, unbal$PERSON), function(i) all(complete.cases(i)))
        #Edward  Frank   Tony 
        #  TRUE   TRUE  FALSE 
        

        你可以这样做来提取,

        ind <- sapply(split(unbal, unbal$PERSON), function(i) all(complete.cases(i)))
        names(ind)[ind]
        #[1] "Edward" "Frank" 
        
        #or for the length
        length(ind[ind])
        #[1] 2
        

        【讨论】:

        • 感谢 Sotos 的回答,这正是我想要的。如何计算具有 TRUE 值的观察值?
        • @AndresAzqueta 如果你想要每个人的真实观察次数,你可以使用这个:colSums(sapply(split(unbal, unbal$PERSON), function(i) complete.cases(i)))
        【解决方案4】:

        你可以试试:

        length(unique(unbal$PERSON[!unbal$PERSON%in%unbal[!complete.cases(unbal),1]]))
        # [1] 2
        

        【讨论】:

          【解决方案5】:

          我会这样做:

          cp = 0
          
          for (i in unique(unbal$PERSON)){
            new_data = unbal[which(unbal$PERSON == i),]
            if (anyNA(new_data) == FALSE){
              cp = cp+1
            }else{
              cp = cp
            }
          }
          
          cp
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-14
            • 2013-07-21
            • 1970-01-01
            • 2021-05-08
            • 2014-08-01
            • 1970-01-01
            相关资源
            最近更新 更多