【发布时间】:2017-05-20 21:19:04
【问题描述】:
我有两个数据框:
dat 是一个 9752x8 的数据帧,其中包含一些 POSIXlt 日期
trips.df 是一个 35772x28 数据帧,包含每小时温度
数据
我想在dat中保存每个日期对应的温度。
我试过了:
trips.df$temperature<-lapply(trips.df$fin, function(x){
dat_meteo[dat_meteo$Date.Heure==round(x,"hours"),7]})
但我得到了这个错误,这让我认为 x 没有作为日期时间变量传递
Error in round(x, "hours") :
non-numeric argument to mathematical function
我也试过这个:
merge(trips.df,dat_meteo[,c(1,7)])
但我也遇到了错误:
Error: cannot allocate vector of size 653.8 Mb
关于如何按日期检索 dat_meteo 数据的任何建议?
我在 Windows 10 上使用 R 版本 3.4.0 和 RStudio 版本 1.0.143 以下是我的数据摘录:
> head(trips.df$fin)
[1] "2013-06-25 16:34:16 EDT" "2013-06-25 16:34:16 EDT" "2013-06-26 13:00:05 EDT"
[4] "2013-06-29 12:52:21 EDT" "2013-06-29 15:34:13 EDT" "2013-06-29 17:39:29 EDT"
> dat_meteo[1870:1875,c(1,7)]
Date.Heure Temp...C.
1870 2013-03-19 18:00:00 -1,2
1871 2013-03-19 19:00:00 -1,7
1872 2013-03-19 20:00:00 -2,1
1873 2013-03-19 21:00:00 -2,8
1874 2013-03-19 22:00:00 -3,0
1875 2013-03-19 23:00:00 -3,7
【问题讨论】:
-
确保两个时间列的格式相同,例如
POSIXct。round()实际上似乎将POSIXct转换为POSIXlt,所以你可以这样做as.POSIXct(round(trips.df$fin,"hours"))。然后你可以使用match()获取对应的索引或者merge,应该可以了。 -
@Lamia,感谢您的意见。代码会是什么样子?我试过这个没有运气:
merge(trips.df,dat_meteo[1,7],by.x=as.POSIXct(round(trips.df$fin,"hours")),by.y = dat_meteo$Date.Heure) -
by.x和by.y需要列名而不是列本身。在trips.df中添加另一列:trips.df$finhours=as.POSIXct(round(trips.df$fin,"hours")),然后执行merge(trips.df,dat_meteo[,c(1,7)],by.x="finhours",by.y ="Date.Heure")。 -
您确定
dat_meteo$Date.Heure不是POSIXlt?POSIXct和POSIXlt是两种完全不同的格式。您应该在问题中包含 2 个数据框的 str()。 -
这个问题很难回答,因为它缺少minimal reproducible example。下次请使用
dput(x)提供工作数据。使用dput(),您使用的数据类型会立即显而易见(比str()好。您在问题中打印的数据摘录既不显示数据类型,也不适合构成一个工作示例(时间/日期范围不重叠)。谢谢。