Значения NA, введенные при фильтрации по нескольким столбцам

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

       locname mo dy   yr nest.stat daynight
1 CARACO CREEK  3  9 1994         U        D
2 CARACO CREEK  4  4 1994      <NA>        D
3 CARACO CREEK  4 14 1994      <NA>        N
4 CARACO CREEK  5  5 1994      <NA>        D
5 CARACO CREEK  5 17 1994      <NA>        N
6 CARACO CREEK  6 29 1994      <NA>        N
7 CARACO CREEK  8  2 1994         F        D

Мне нужно удалить седьмую запись, которая уникальна в наборе данных locname_yr_nest.stat (я не могу просто сказать df [-7,], потому что позиция может измениться при новых итерациях данных).

Я пытался

df[!(df$locname=="CARACO CREEK" & df$nest.stat=="F" & df$yr==1994),]

но это возвращается

          locname mo dy   yr nest.stat daynight
1    CARACO CREEK  3  9 1994         U        D
NA           <NA> NA NA   NA      <NA>     <NA>
NA.1         <NA> NA NA   NA      <NA>     <NA>
NA.2         <NA> NA NA   NA      <NA>     <NA>
NA.3         <NA> NA NA   NA      <NA>     <NA>
NA.4         <NA> NA NA   NA      <NA>     <NA>

Если я фильтрую только по двум столбцам (например, locname и yr), он работает нормально. Вот как я создал этот меньший набор из большего, показывая все записи 1994 года. Однако добавление третьего столбца отбрасывает его. В качестве дополнительного примечания, этот точный подход работал в другом наборе данных в разных столбцах.

Вот примерный набор для простоты:

df <- structure(list(locname = c("CARACO CREEK", "CARACO CREEK", "CARACO CREEK", 
"CARACO CREEK", "CARACO CREEK", "CARACO CREEK", "CARACO CREEK"
), mo = c(3, 4, 4, 5, 5, 6, 8), dy = c(9, 4, 14, 5, 17, 29, 2
), yr = c(1994, 1994, 1994, 1994, 1994, 1994, 1994), nest.stat = c("U", 
NA, NA, NA, NA, NA, "F"), daynight = c("D", "D", "N", "D", "N", 
"N", "D")), class = "data.frame", row.names = c(NA, 7L))

person A.Birdman    schedule 11.01.2019    source источник


Ответы (1)


Ваша условная проверка nest.stat не выполняется при сравнении "F" с NA.

Вот беспорядочный способ сделать это на базе R:

df[!(df$locname == "CARACO CREEK" & 
     ifelse(!is.na(df$nest.stat),df$nest.stat == "F",FALSE) &
      df$yr == 1994),]

Выход:

   locname mo dy   yr nest.stat daynight
1 CARACO CREEK  3  9 1994         U        D
2 CARACO CREEK  4  4 1994      <NA>        D
3 CARACO CREEK  4 14 1994      <NA>        N
4 CARACO CREEK  5  5 1994      <NA>        D
5 CARACO CREEK  5 17 1994      <NA>        N
6 CARACO CREEK  6 29 1994      <NA>        N
person shwan    schedule 11.01.2019
comment
Спасибо! Я не совсем понимаю логику вызова ifelse, но он работает, и я разберусь с этим позже! - person A.Birdman; 12.01.2019
comment
Синтаксис ifelse: ifelse (условный оператор, результат ИСТИНА, результат ЛОЖЬ). Итак, в этом случае, если nest.stat не NA, тогда проверьте, nest.stat == "F", иначе просто верните FALSE - person shwan; 12.01.2019