【发布时间】:2018-08-18 03:16:21
【问题描述】:
我有一个相当大的数据框(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 行中的每一行?
这是我第一次发帖,但长时间阅读和学习。非常感谢。
【问题讨论】:
-
使用
unique函数将这些唯一日期隔离到它们自己的data.frame。计算这个最小集合的太阳正午。将结果合并回原始数据。如果没有可重复的示例,我只能提供此建议来帮助您继续前进(以及进一步向 Google 提供一些“流行语”) -
您是否还需要传递
lat和lon坐标才能获得“solarNoon”时间?此外,使用keep参数只计算“solarNoon”,避免其他不需要的计算。 -
尽早分配
df$date <- as.Date(df$date),最好在你读完之后立即分配。字符串比日期对象更笨拙。这样您就可以避免创建一个包含 1.65m 字符串的临时字符串,其中 99% 以上都是重复的。 -
你完全不需要这个,但是R supports caching function calls,所以再次调用它 1.65m 上只有 3000 个唯一值只会导致 3000 次调用。但只需使用 dplyr::group_by(date)
-
这都是很好的反馈。我已经实现了。非常感谢。