如果我有一个大型数据库,包括一个' id' var,我想列出所有感兴趣的变量,并返回一个缺少每个特定变量的id列表。
#Fake Data:
set.seed(11100)
missdata<-data.frame(id<-1:1000,C1<-sample(c(1,NA),1000,replace=TRUE,prob=c(.8,.2)), C2<-sample(c(1,NA),1000,replace=TRUE,prob=c(.8,.2)))
names(missdata)<-c("id","v1","v2")
#One variable solution:
missdatatest<-subset(missdata, is.na(v1),select=id)
missdatatest[1:10,]
> missdatatest[1:10,]
[1] 5 30 44 47 48 49 57 65 68 74
#Looking to build a function...
FindMissings<-function(indata,varslist,printvar){
printonevar<-function(var){
missdatalist<-subset(indata, is.na(var),select=printvar)
print(missdatalist)
}
lapply(vars,printonevar)
}
#Run function:
vars<-c("v1","v2")
FindMissings(missdata,vars,id)
#Error:
> FindMissings(missdata,vars,id)
Error in `[.data.frame`(x, r, vars, drop = drop) : undefined columns selected
任何帮助将不胜感激。我最初编写了一个在SAS中执行此操作的函数,它工作得非常好,但我试图将我的大部分工作转移到R.
答案 0 :(得分:3)
不需要这样的功能。只需使用lapply
:
> lapply(missdata[-1], function(x) which(is.na(x)))
$v1
[1] 5 30 44 47 48 49 57 65 68 74 89 103 107 110 115 119 152 167
[19] 175 176 194 197 199 202 204 212 215 223 231 232 233 239 245 280 281 293...
<<SNIP>>
$v2
[1] 3 6 18 19 22 23 27 28 33 38 41 50 51 55 60 66 68 77
[19] 81 84 86 96 97 99 109 116 117 134 139 141 143 146 148 153 165 168...
<<SNIP>>
如果您特别想要从“id”列(而不仅仅是NA
值的位置)返回值,则可以将语句修改为:
lapply(missdata[-1], function(x) missdata$id[which(is.na(x))])
如果您关心如何将此方法用于特定变量,那么它非常简单:
vars <- c("v1","v2")
lapply(missdata[vars], function(x) which(is.na(x)))