Как найти и удалить фрагменты строк, в которых отсутствуют данные в R data.frame? - PullRequest
0 голосов
/ 05 мая 2020

Я использую фрейм данных, который включает Pixel ID, Year, координаты XY и Temperature значения. Для некоторых идентификаторов Pixel ID значение Temperature равно NA на каждый год (см. Pixel ID 1). Для других идентификаторов пикселей значение Temperature равно «NA» только в течение нескольких лет (см. Pixel ID 2). Я бы хотел найти и удалить эти Pixel ID, если все значения для всех лет (Year всегда повторяется с 2001 по 2005 г.) равны NA. Я хотел бы сохранить эти Pixel ID, если хотя бы одно из значений не является NA значением.

Вот пример фрейма данных, с которым я работаю

> head(Temperature_sorted, n = 10)
# A tibble: 10 x 5
   PixelID  Year     X     Y Temperature
     <dbl> <dbl> <dbl> <dbl>       <dbl>
 1       1  2001  70.8  73.5          NA
 2       1  2002  70.8  73.5          NA
 3       1  2003  70.8  73.5          NA
 4       1  2004  70.8  73.5          NA
 5       1  2005  70.8  73.5          NA
 6       2  2001  70.8  73.5         0.2
 7       2  2002  70.8  73.5         0.4
 8       2  2003  70.8  73.5          NA
 9       2  2004  70.8  73.5         0.5
10       2  2005  70.8  73.5         0.3

и вот пример вывода, который мне нужен

> head(Temperature_sorted, n = 10)
# A tibble: 10 x 5
   PixelID  Year     X     Y Temperature
     <dbl> <dbl> <dbl> <dbl>       <dbl>
 1       2  2001  70.8  73.5         0.2
 2       2  2002  70.8  73.5         0.4
 3       2  2003  70.8  73.5          NA
 4       2  2004  70.8  73.5         0.5
 5       2  2005  70.8  73.5         0.3
 6       3  2001  70.8  73.5          NA
 7       3  2002  70.8  73.5         0.7
 8       3  2003  70.8  73.5         0.9
 9       3  2004  70.8  73.5          NA
10       3  2005  70.8  73.5         0.9

У меня есть несколько тысяч Pixel ID значений, поэтому я хотел бы использовать a для l oop, если это возможно.

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Использование dplyr:

library(dplyr)

Temperature_sorted %>%
  group_by(PixelID) %>%
  filter(any(!is.na(Temperature)))

Сначала мы группируем строки по PixelID, затем для каждой строки мы проверяем, имеют ли какие-либо строки с тем же PixelID значение температуры, отличное от NA.

1 голос
/ 05 мая 2020

Мы можем выбрать те группы, в которых нет всех NA.

Это можно сделать в базе R:

subset(df, !ave(is.na(Temperature), PixelID, FUN = all)) 

#   PixelID Year    X    Y Temperature
#6        2 2001 70.8 73.5         0.2
#7        2 2002 70.8 73.5         0.4
#8        2 2003 70.8 73.5          NA
#9        2 2004 70.8 73.5         0.5
#10       2 2005 70.8 73.5         0.3

dplyr

library(dplyr)
df %>% group_by(PixelID) %>%  filter(!all(is.na(Temperature)))

и data.table

library(data.table)
setDT(df)[, .SD[!all(is.na(Temperature))], PixelID]

данные

df <- structure(list(PixelID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L), Year = c(2001L, 2002L, 2003L, 2004L, 2005L, 2001L, 2002L, 
2003L, 2004L, 2005L), X = c(70.8, 70.8, 70.8, 70.8, 70.8, 70.8, 
70.8, 70.8, 70.8, 70.8), Y = c(73.5, 73.5, 73.5, 73.5, 73.5, 
73.5, 73.5, 73.5, 73.5, 73.5), Temperature = c(NA, NA, NA, NA, 
NA, 0.2, 0.4, NA, 0.5, 0.3)), class = "data.frame", row.names = c(NA, -10L))
...