Возвращать идентификационные номера, если они отсутствуют для набора переменных

#r

#r

Вопрос:

Если у меня большая база данных, включающая переменную ‘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.

Ответ №1:

В такой функции нет необходимости. Просто используй 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)))
  

Комментарии:

1. Ну, я хотел бы вывести список идентификаторов для каждой переменной в отдельный документ «в конечном итоге» с заголовком, специфичным для этой переменной. Это то, что я знаю, как сделать, как только получу отдельные списки для каждого из них с помощью некоторого итеративного процесса. Я не уверен, как бы я это сделал с помощью процесса, который вы показали. И кажется, что это касается ВСЕХ переменных. Я захочу использовать только некоторые переменные IRL.

2. @user2438475: Вы можете легко получить доступ к элементам списка по их позициям или именам. Если бы вы сохранили выходные данные выше как «out», получение результата для «v1» было бы выполнено с помощью out[[1]] или out[["v1"]] .