如何在 R data.frame 中查找和删除所有缺失数据的行块?

How do I find and remove row chunks that all have missing data in an R data.frame?

我正在使用包含 Pixel IDYear、XY 坐标和 Temperature 值的数据框。对于某些像素 ID,每年的 Temperature 值为 NA(请参阅 Pixel ID 1)。对于其他像素 ID,Temperature 值仅在某些年份为 'NA'(请参阅 Pixel ID 2)。如果所有年份(Year 始终从 2001-2005 重复)的所有值都是 NA,我想要找到并删除那些 Pixel ID。即使其中一个值是非 NA 值,我也想保留这些 Pixel ID

这是我正在使用的数据框示例

> 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 循环。

使用 dplyr:

library(dplyr)

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

首先我们按 PixelID 对行进行分组,然后对于每一行,我们检查具有相同 PixelID 的任何行是否具有不为 NA 的温度值。

我们可以select那些没有全部NA的组。

这可以在 base 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))