我有一个包含10570个元素的Large 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]
}
}
}
代码有效,但速度很慢,任何人都可以帮我优化吗?
答案 0 :(得分:0)
列中没有与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,]