我想计算具有非缺失值的观察数量(以下示例中的人员)。
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,因为只有两个人(弗兰克和爱德华)拥有所有数据。
答案 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