检索具有非缺失值的观察数
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
我想计算具有非缺失值的观察值(在我的以下示例中为 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