используя R для выбора строк в наборе данных с соответствующими отсутствующими наблюдениями - PullRequest
2 голосов
/ 02 февраля 2012

Я определил, как идентифицировать все уникальные схемы отсутствующих наблюдений в наборе данных. Теперь я хотел бы выбрать все строки в этом наборе данных с заданным шаблоном пропущенных наблюдений. Я хотел бы сделать это итеративно, чтобы в случае наличия n наборов пропущенных наблюдений в наборе данных я получал n наборов данных, каждый из которых содержал только 1 шаблон пропущенных наблюдений.

Я знаю, как это сделать, но мой метод не очень эффективен и не является общим. Я надеюсь изучить более эффективный и более общий подход, потому что мои реальные наборы данных намного больше и более изменчивы, чем в примере ниже.

Вот пример набора данных и код, который я использую. Я не потрудился включить код, который использовал для создания матрицы zzz из матрицы dd, но могу добавить этот код, если это поможет.

dd  <- matrix(c( 
            1, 0, 1, 1,
            NA, 1, 1, 0, 
            NA, 0, 0, 0, 
            NA, 1,NA, 1, 
            NA, 1, 1, 1, 
             0, 0, 1, 0, 
            NA, 0, 0, 0, 
             0,NA,NA,NA, 
             1,NA,NA,NA, 
             1, 1, 1, 1, 
            NA, 1, 1, 0), 
nrow=11, byrow=T) 

zzz <- matrix(c(
             1, 1, 1, 1,
            NA, 1, 1, 1, 
            NA, 1,NA, 1, 
             1,NA,NA,NA
), nrow=4, byrow=T) 

for(jj in 1:dim(zzz)[1]) { 
ddd <- 
dd[ 
((dd[, 1]%in%c(0,1) & zzz[jj, 1]%in%c(0,1)) | 
    (is.na(dd[, 1]) & is.na(zzz[jj, 1]))) & 
((dd[, 2]%in%c(0,1) & zzz[jj, 2]%in%c(0,1)) | 
(is.na(dd[, 2]) & is.na(zzz[jj, 2]))) & 
((dd[, 3]%in%c(0,1) & zzz[jj, 3]%in%c(0,1)) | 
(is.na(dd[, 3]) & is.na(zzz[jj, 3]))) & 
((dd[, 4]%in%c(0,1) & zzz[jj, 4]%in%c(0,1)) | 
(is.na(dd[, 4]) & is.na(zzz[jj, 4]))),] 

print(ddd) 
} 

4 результирующих набора данных в этом примере:

a) 
1    0    1    1 
0    0    1    0 
1    1    1    1 

b) 
NA    1    1    0 
NA    0    0    0 
NA    1    1    1 
NA    0    0    0 
NA    1    1    0 

c) 
NA  1 NA  1 

d) 
0   NA   NA   NA 
1   NA   NA   NA 

Есть ли более общий и более эффективный способ сделать то же самое? В приведенном выше примере 4 результирующих набора данных не сохраняются, но я сохраняю их с моими реальными данными.

Спасибо за любой совет.

Марк Миллер

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012
# Missing value patterns (TRUE=missing, FALSE=present)
patterns <- unique( is.na(dd) )

result <- list()
for( i in seq_len(nrow(patterns))) {
  # Rows with this pattern
  rows <- apply( dd, 1, function(u) all( is.na(u) == patterns[i,] ) )
  result <- append( result, list(dd[rows,]) )
}
1 голос
/ 02 февраля 2012

Не совсем уверен, что я понимаю вопрос, но вот удар по нему ...

Первое, что вы хотите сделать, это выяснить, какие элементы являются NA, а какие нет. Для этого вы можете использовать функцию is.na ().

is.na(dd)

сгенерирует матрицу того же размера, что и dd, содержащую TRUE, где значением было NA, и FALSE в другом месте.

Затем вы хотите найти уникальные шаблоны в вашей матрице. Для этого вам нужна функция unique (), которая принимает параметр 'margin', позволяющий находить в матрице только уникальные строки.

zzz <- unique(is.na(dd), margin=1)

создает матрицу, аналогичную вашей матрице zzz, но вы, конечно, можете заменить «ИСТИНА» на NA и «ЛОЖЬ» на 1, чтобы она была идентична вашей матрице.

Затем вы можете пройти несколько направлений отсюда, чтобы попытаться отсортировать их по различным наборам данных. К сожалению, я думаю, вам понадобится одна петля.

results <- list()
for (r in 1:nrow(dd)){
  ind <- which(apply (zzz, 1, function(x) {all(x==is.na(dd[r,]))}))
  if (ind %in% names(results)){
    results[[ind]] <- rbind(results[[ind]], dd[r,])
  }
  else{
    results[[ind]] <- dd[r,]
    names(results)[ind] <- ind
  }
}

В этот момент у вас есть список, который содержит все строки dd, отсортированные по схеме NA. Вы обнаружите, что шаблон, выраженный в строке 1 zzz, будет соответствовать строке 1 результатов, и то же самое для остальных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...