Я использую фрейм данных, который содержит Pixel ID, Year, координаты XY и Temperature значения. Для некоторых идентификаторов пикселей значение 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 значений, поэтому я хотел бы использовать цикл for, если это возможно.

0
tassones 5 Май 2020 в 04:29

2 ответа

Лучший ответ

Используя dplyr:

library(dplyr)

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

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

2
RyanFrost 5 Май 2020 в 01:40

Мы можем выбрать те группы, которые не имеют всех 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))
1
Ronak Shah 5 Май 2020 в 01:38