【问题标题】:How do I find and remove row chunks that all have missing data in an R data.frame?如何在 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 循环。

【问题讨论】:

    标签: r for-loop geo


    【解决方案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 中的答案。我印象深刻。
      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多