我有一个相当大的数据框(1.65 MM 行),如下所示:
date dayofyear time humidity temp
1 2008-01-01 1 300 99 38.2
2 2008-01-01 1 302 99 38.5
3 2008-01-01 1 304 99 38.5
4 2008-01-01 1 306 99 38.6
5 2008-01-01 1 308 99 38.9
6 2008-01-01 1 310 99 39.1
....
我想计算每一行的正午,并将其作为新列添加到数据框中。该suncalc::getSunlightTimes(date)
函数为我提供任何给定日期的正午。
如果我这样做:
solarNoons <- suncalc::getSunlightTimes(date = as.Date(dataFrame$date))
然后(显然)即使在一个小时后,命令也没有完成。
一个观察结果——即使数据框中有 1.65 MM 行,也只有大约 3000 个唯一日期。解决这个问题的最佳方法是什么?是否可以只调用getSunlightTimes()
3000 次并仍然使用新列中的值填充数据框的 1.65 MM 行中的每一行?
这是我第一次发帖,但长时间阅读和学习。非常感激。
以下应该工作。假设我们生成一个 200 万行的数据框:
> N <- 2e6
> R <- data.frame(year = sample(2000:2009,N,TRUE),
+ dayofyear = sample(365,N,TRUE),
+ time = floor(runif(N,0,12))*100+floor(runif(N,0,60)),
+ humidity = 99,
+ temp = floor(runif(N,15,40)))
> R$date <- as.Date(with(R,strptime(paste(year,dayofyear),
+ "%Y %j", tz="GMT")))
> nrow(R)
[1] 2000000
> head(R)
year dayofyear time humidity temp date
1 2000 206 307 99 39 2000-07-24
2 2009 101 1019 99 16 2009-04-11
3 2004 307 547 99 21 2004-11-02
4 2003 270 1158 99 33 2003-09-27
5 2006 21 330 99 22 2006-01-21
6 2005 154 516 99 21 2005-06-03
>
在这种情况下,date
已经是一Date
列,但如果你的是一个字符列,那么:
> R$date <- as.Date(R$date)
应该只需要几秒钟。
现在,获取所有唯一日期值的列表。这应该很快:
> dates <- unique(R$date)
> print(length(dates))
[1] 3650
>
现在,getSunlightTimes
在这个向量上运行。在我的机器上使用suncalc
0.4 版和 R 版 3.4.4只花了几秒钟:
> times <- suncalc::getSunlightTimes(dates, lat=0, lon=0)
现在,生成一个索引向量,给出R$date
唯一日期向量中每个日期的索引dates
:
> i <- match(R$date, dates)
现在,times
通过相同的索引选择数据帧的行:
> solarNoons <- times[i,]
> nrow(solarNoons)
[1] 2000000
>
如果我们选择一行 R:
> R[1234567,]
year dayofyear time humidity temp date
1234567 2002 24 535 99 17 2002-01-24
你会看到对应的行solarNoons
是那个日期的结果:
> solarNoons[1234567,]
date lat lon solarNoon nadir
2616.352 2002-01-24 12:00:00 0 0 2002-01-24 12:13:14 2002-01-24 00:13:14
sunrise sunset sunriseEnd
2616.352 2002-01-24 06:09:42 2002-01-24 18:16:46 2002-01-24 06:11:58
sunsetStart dawn dusk
2616.352 2002-01-24 18:14:30 2002-01-24 05:47:49 2002-01-24 18:38:39
nauticalDawn nauticalDusk nightEnd
2616.352 2002-01-24 05:22:22 2002-01-24 19:04:06 2002-01-24 04:56:50
night goldenHourEnd goldenHour
2616.352 2002-01-24 19:29:38 2002-01-24 06:38:39 2002-01-24 17:47:49
>
如果需要,您可以将两个数据框合并在一起:
> R2 <- cbind(R, solarNoons)
这一切都假设“1.65 MM”意味着 165 万。如果您的意思是 165 万(即美国的万亿美元),那么您将需要一台更大的计算机。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句