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

时间:2017-07-05 07:49:55

标签: r panel

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

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,因为只有两个人(弗兰克和爱德华)拥有所有数据。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

您可以尝试:

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

答案 2 :(得分: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 :(得分:1)

我会这样做:

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

答案 4 :(得分: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