I have thousands of entries in hkdata.2 and I want to create a loop that can help me to sum up the total exposed mxtemp from another data frame data.1 for each member in each houseID in data.2
Could any expert give me a hand on this?
weather.data
date mpressure mxtemp
1 2008-01-01 1025.3 15.7
2 2008-01-02 1025.6 16.0
3 2008-01-03 1023.6 18.1
4 2008-01-04 1021.8 18.4
5 2008-01-05 1020.1 20.9
6 2008-01-06 1019.7 20.7
7 2008-01-07 1018.4 24.0
8 2008-01-08 1016.7 23.7
hkdata.2
row.names houseID member male date.end date.begin
1 1 1 1 2008-01-07 2008-01-02
2 1 2 0 2008-01-06 2008-01-04
I want to get the sum of mxtemp from the date.begin and date.end interval of that same member experienced and show it like this.
hkdata.2
row.names houseID member date.end date.begin Total.exposed.mxtemp
1 1 1 2008-01-07 2008-01-02 118.1
2 1 2 2008-01-06 2008-01-04 60
total.exposed.mxtemp is the sum of mxtemp within the corresponding interval (which is from date.begin to date.end) ie. In row.names 1, 118.1 = 16+18.1+18.4+20.9+20.7+24
My codes are like this..
> cbind(hkdata.2, t(sapply(apply(hkdata.2, 1, function(x)
+ weather.data[weather.data$date >= x[6] &
+ weather.data$date <= x[5], c("mxtemp")]), colSums)))
Then I got this error.....:
Error in FUN(X[[1L]], ...) :
'x' must be an array of at least two dimensions
Could any expert please help!!
Here's one possibility that results in what you described as desired result. I'm not sure whether this is 100% dplyr idiomatic because I'm working on two different data.frames, but anyway, it seems to work.
library(dplyr)
hkdata.2 <- hkdata.2 %>%
group_by(houseID, member) %>%
mutate(Totalmxtemp = sum(weather.data$mxtemp[weather.data$date >= date.begin &
weather.data$date <= date.end]))
hkdata.2
#Source: local data frame [2 x 7]
#Groups: houseID, member
#
# row.names houseID member male date.end date.begin Totalmxtemp
#1 1 1 1 1 2008-01-07 2008-01-02 118.1
#2 2 1 2 0 2008-01-06 2008-01-04 60.0
来源:https://stackoverflow.com/questions/24807775/summing-up-values-within-an-interval-from-another-data-frame-in-r