检索具有非缺失值的观察数

retrieving number of observations with non missing values

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

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,因为只有两个人(Frank 和 Edward)拥有所有数据。

通过 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

我会这样做:

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

我们可以使用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

你可以试试:

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

我们可以使用anyNA,它可以和by一起对data.frames进行操作。在 ! 运算符之前将结果取反为 return 所需的值。

使用by,

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

或 return 命名向量,将其包装在 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