【问题标题】:How to operate a dataframe based on lat, lon, time in R?如何在R中操作基于纬度,经度,时间的数据框?
【发布时间】:2021-07-23 16:16:03
【问题描述】:

我是 R 新手,具有处理光栅和 netCDF 文件的背景,我尝试寻找这个问题的答案,但找不到任何东西。

这个数据框有时间和空间变量。时间由Year 表示,空间位置既可以与ADM2_PCODE 相关,也可以与geometry 列中的纬度、经度对构建的多边形相关。我想找到一种方法来选择每个位置至少有 5 年的数据 (Valor != NA)。我想这可以通过ADM2_PCODEgeometry 进行索引。

在正常的 netcdf 操作中,我会使用 where(sum(Valor != NA).dim('Year')>= 5) 之类的东西。但是,这里的情况需要使用表格或矢量解决方案,而我没有操作矢量的经验。我知道可以以特定分辨率将表格转换为栅格,但我认为最好通过将操作保持为表格格式或矢量来最小化错误和残差。我想知道是否有人可以帮助我解决这个问题。

数据框/表格外观的小例子:

Simple feature collection with 6 features and 3 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -62.8941 ymin: -13.1178 xmax: -61.88647 ymax: -11.82782
CRS:           NA
   Year ADM2_PCODE Valor                       geometry
1 1981    1100015    NA MULTIPOLYGON (((-62.0495 -1...
2 1982    1100015    NA MULTIPOLYGON (((-62.0495 -1...
3 1983    1100015    NA MULTIPOLYGON (((-62.0495 -1...
4 1984    1100015    NA MULTIPOLYGON (((-62.0495 -1...
5 1985    1100015    NA MULTIPOLYGON (((-62.0495 -1...
6 1986    1100015    NA MULTIPOLYGON (((-62.0495 -1...

【问题讨论】:

    标签: r where-clause polygon r-raster


    【解决方案1】:

    您是否正在寻找这样的解决方案。我添加了更多数据:

    library(dplyr)
    df %>%  
      group_by(ADM2_PCODE) %>% 
      count(duration_year = max(Year)-min(Year) & !is.na(Valor))
    
    

    数据框:

    df <- structure(list(Year = c(1981, 1982, 1983, 1984, 1985, 1986, 1981, 
    1982, 1983, 1984, 1985, 1986), ADM2_PCODE = c(1100015, 1100015, 
    1100015, 1100015, 1100015, 1100015, 1100016, 1100016, 1100016, 
    1100016, 1100016, 1100016), Valor = c(NA, NA, NA, NA, NA, NA, 
    10, 10, 10, 10, 10, 10), geometry = c("MULTIPOLYGON (((-62.0495 -1...", 
    "MULTIPOLYGON (((-62.0495 -1...", "MULTIPOLYGON (((-62.0495 -1...", 
    "MULTIPOLYGON (((-62.0495 -1...", "MULTIPOLYGON (((-62.0495 -1...", 
    "MULTIPOLYGON (((-62.0495 -1...", "MULTIPOLYGON (((-63.0495 -1...", 
    "MULTIPOLYGON (((-63.0495 -1...", "MULTIPOLYGON (((-63.0495 -1...", 
    "MULTIPOLYGON (((-63.0495 -1...", "MULTIPOLYGON (((-63.0495 -1...", 
    "MULTIPOLYGON (((-63.0495 -1...")), row.names = c(NA, -12L), class = c("tbl_df", 
    "tbl", "data.frame"))
    

    输出:

      ADM2_PCODE duration_year     n
           <dbl> <lgl>         <int>
    1    1100015 FALSE             6
    2    1100016 TRUE              6
    

    【讨论】:

    • 您好 TarJae,感谢您的回复。答案很好,我唯一要问的是是否可以只选择带有数字的案例(duration_year == TRUE 也许?)?谢谢!
    • 是的。只需添加filter(duration_year == TRUE)。喜欢:df %&gt;% group_by(ADM2_PCODE) %&gt;% count(duration_year = max(Year)-min(Year) &amp; !is.na(Valor)) %&gt;% filter(duration_year == TRUE)
    • 非常感谢!非常有趣的是,R 的管道概念与 numpy/pandas 有多么不同。我的最后一点是我想要一个将n &gt;= 5 定义为true 和n &lt; 5 的掩码,所以我想使用类似:df_duration$time_mask &lt;- ifelse(df_duration$n &gt; 5, TRUE, FALSE)。但是,有没有办法在管道中做到这一点?谢谢!
    • 您可以mutate 一个新列并使用ifelse 语句。像这样:df %&gt;% group_by(ADM2_PCODE) %&gt;% count(duration_year = max(Year)-min(Year) &amp; !is.na(Valor)) %&gt;% filter(duration_year == TRUE) %&gt;% mutate(time_mask = ifelse(n &gt; 5, TRUE, FALSE))
    猜你喜欢
    • 2016-02-06
    • 2021-04-28
    • 2023-03-31
    • 1970-01-01
    • 2015-10-03
    • 2021-03-02
    • 2019-02-18
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多