如何在 R data.frame 中查找和删除所有缺失数据的行块?
How do I find and remove row chunks that all have missing data in an R data.frame?
我正在使用包含 Pixel ID
、Year
、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))
我正在使用包含 Pixel ID
、Year
、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))