如何在 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 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 循环。

【问题讨论】:

【参考方案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 Rdplyrdata.table 中的答案。我印象深刻。

以上是关于如何在 R data.frame 中查找和删除所有缺少数据的行块?的主要内容,如果未能解决你的问题,请参考以下文章

从 R 中的 data.frame 中删除一整列

如何在R中向一个data frame指定位置插入一列或一行

R循环使用列表中的data.frame的函数

在 data.frame 中查找字符串

如何在 R 中舍入包含一些字符变量的 data.frame?

使用 R [关闭] 计算 data.frame 中存在的 NA 值的平均值