gpt4 book ai didi

r - 使用一个数据帧对R中另一个数据帧的一系列数据求和

转载 作者:行者123 更新时间:2023-12-02 05:10:05 24 4
gpt4 key购买 nike

我正在从 SAS 迁移到 R。我需要帮助弄清楚如何汇总日期范围内的天气数据。在 SAS 中,我采用日期范围,使用数据步骤为每个日期(使用 startdateenddatedate)创建记录范围,与天气合并,然后汇总 (VAR hdd cdd; CLASS=startdate enddate sum=) 以汇总日期范围的值。

R代码:

startdate <- c(100,103,107)
enddate <- c(105,104,110)
billperiods <-data.frame(startdate,enddate);

得到:

> billperiods
startdate enddate
1 100 105
2 103 104
3 107 110

R代码:

weatherdate <- c(100:103,105:110)
hdd <- c(0,0,4,5,0,0,3,1,9,0)
cdd <- c(4,1,0,0,5,6,0,0,0,10)
weather <- data.frame(weatherdate,hdd,cdd)

得到:

> weather
weatherdate hdd cdd
1 100 0 4
2 101 0 1
3 102 4 0
4 103 5 0
5 105 0 5
6 106 0 6
7 107 3 0
8 108 1 0
9 109 9 0
10 110 0 10

注意:缺少 weatherdate = 104。我可能一天都没有天气。

我不知道怎么去:

> billweather
startdate enddate sumhdd sumcdd
1 100 105 9 10
2 103 104 5 0
3 107 110 13 10

sumhddhddstartdateenddate 天气 的总和>data.frame.

有什么想法吗?

最佳答案

这是一个使用 IRangesdata.table 的方法。看起来,对于这个问题,这个答案似乎有点矫枉过正。但总的来说,我发现使用 IRanges 来处理区间很方便,它们可能是多么简单。

# load packages
require(IRanges)
require(data.table)

# convert data.frames to data.tables
dt1 <- data.table(billperiods)
dt2 <- data.table(weather)

# construct Ranges to get overlaps
ir1 <- IRanges(dt1$startdate, dt1$enddate)
ir2 <- IRanges(dt2$weatherdate, width=1) # start = end

# find Overlaps
olaps <- findOverlaps(ir1, ir2)

# Hits of length 10
# queryLength: 3
# subjectLength: 10
# queryHits subjectHits
# <integer> <integer>
# 1 1 1
# 2 1 2
# 3 1 3
# 4 1 4
# 5 1 5
# 6 2 4
# 7 3 7
# 8 3 8
# 9 3 9
# 10 3 10

# get billweather (final output)
billweather <- cbind(dt1[queryHits(olaps)],
dt2[subjectHits(olaps),
list(hdd, cdd)])[, list(sumhdd = sum(hdd),
sumcdd = sum(cdd)),
by=list(startdate, enddate)]

# startdate enddate sumhdd sumcdd
# 1: 100 105 9 10
# 2: 103 104 5 0
# 3: 107 110 13 10

最后一行的代码分解: 首先,我在中间使用 queryHitssubjectHitscbind 构建data.table 然后,我按 startdate、enddate 分组并得到 hddcdd 的总和>。为了更好地理解,如下所示单独查看该行更容易。

# split for easier understanding
billweather <- cbind(dt1[queryHits(olaps)],
dt2[subjectHits(olaps),
list(hdd, cdd)])
billweather <- billweather[, list(sumhdd = sum(hdd),
sumcdd = sum(cdd)),
by=list(startdate, enddate)]

关于r - 使用一个数据帧对R中另一个数据帧的一系列数据求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com