如何在 R data.frame 中查找和删除所有缺少数据的行块?
Posted
技术标签:
【中文标题】如何在 R data.frame 中查找和删除所有缺少数据的行块?【英文标题】:How do I find and remove row chunks that all have missing data in an R data.frame? 【发布时间】:2020-08-19 14:11:52 【问题描述】:我正在使用包含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 循环。
【问题讨论】:
【参考方案1】:使用 dplyr:
library(dplyr)
Temperature_sorted %>%
group_by(PixelID) %>%
filter(any(!is.na(Temperature)))
首先我们按 PixelID 对行进行分组,然后对于每一行,我们检查是否有任何具有相同 PixelID 的行的温度值不是 NA。
【讨论】:
【参考方案2】:我们可以选择那些不包含所有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))
【讨论】:
一个巡回演出!Base R
、dplyr
和 data.table
中的答案。我印象深刻。以上是关于如何在 R data.frame 中查找和删除所有缺少数据的行块?的主要内容,如果未能解决你的问题,请参考以下文章