【问题标题】:R code optimization with a data.frame使用 data.frame 优化 R 代码
【发布时间】:2014-05-24 08:16:40
【问题描述】:

我有一个包含 10570 个元素的大型 SpatialPointDataFrame,其中每一行都是一个具有关联日期的点(某些行具有相同的日期)。该对象有 4760 列(它是 RasterStack 和点之间的 extract() 函数的输出),每列对应一个日期和相关值(温度)。

简化示例:

DATE2       BICHO   X2000.01.01   X2000.01.02   (...)   X2012.12.31
2009-04-08  Woody      20.7          19.2        ...         9.5
2009-04-09  Woody      20.7          19.2        ...         9.5
2009-04-10  Woody      20.7          19.2        ...         9.5
2004-11-30  Woody      20.7          19.2        ...         9.5
2004-12-01  Buzz       20.7          19.2        ...         9.5
2004-12-02  Buzz       20.7          19.2        ...         9.5

我想做的是在这个 data.frame 中创建一个新列 (TP),其中包含每个相应日期的温度。

for(i in 11:4760){
  datas<-str_sub(colnames(pts@data[i]), start=2,end=11L)
  datas<-format(as.Date(datas, "%Y.%m.%d"),"%Y-%m-%d")
  for(j in seq_along(pts@data$TP)){
    print(c(i,j))   #just a print to see how fast is the code
    if(as.character(factor(pts$DATE2[j]))==datas){
      pts@data[j,]$TP<-pts@data[j,][i]
    }
  }
}

代码可以运行,但是速度很慢,谁能帮我优化一下?

【问题讨论】:

  • 第 1 列 ["DATE2"] 中有日期,每列 ["X2000.01.01"] 中有日期。 “对应日期”是指哪一个?
  • 对应的日期是DATE2。我的目标是(在列中)找到与行日期对应的值。
  • 不清楚。您是否尝试将列名称日期与 DATE2 列中的日期值匹配?我还要指出,由于您的列显然是按天排列的,因此您不需要转换其中的任何一个。只需获取列号并使用一些日期/时间函数将该值作为“天”添加到您的基准日期。
  • 是的,我想将 DATE2 列与相应列命名日期的值相匹配。但我不明白我将如何实现它。

标签: r optimization stack raster


【解决方案1】:

列中没有与 DATE2 日期匹配的日期,但我希望这对您有用:

library(data.table)
library(lubridate)
df = data.table(df) 
dfm = data.table:::melt.data.table(df,
                               id.var = c("DATE2","BICHO"), 
                               variable.name = "date", 
                               value.name = "TP")
dfm[,date := gsub("X","",date)]
dfm[,date := ymd(date)]
dfm[,DATE2 := ymd(DATE2)]
dfm[DATE2 == date,]

【讨论】:

  • 您的代码给了我一个包含 4 列的表格:DATE2、BICHO、日期和 tp。 date 是用 NA 填充的列,tp 是用 TIME2、LAT2、LONG2、NAME_0 和 NAME_1 的 df 值填充的列。
  • 我无法重现您的错误。您是否安装了 lubridate 和 data.table 库?如果您提供有日期 - DATE2 匹配的数据样本,将会很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多