在R中跨数据帧聚合数据
我有两个数据帧。df1是一个数据帧,它在一组单元中包含多个位置。df2包括所有位置的每日最高温度观测值(df$tmax)。对于df1内的每个单元,我想计算每个单元内所有位置的平均每日最高温度 下面的代码生成每个数据帧的示例。我需要将其扩展到大约240个单元和8年的每日数据 在R中的这种查找/匹配练习似乎总是让我着迷。必须有一个明显的方法来做到这一点,但我现在遇到了阻碍,没有一些真正的蛮力加入等在R中跨数据帧聚合数据,r,R,我有两个数据帧。df1是一个数据帧,它在一组单元中包含多个位置。df2包括所有位置的每日最高温度观测值(df$tmax)。对于df1内的每个单元,我想计算每个单元内所有位置的平均每日最高温度 下面的代码生成每个数据帧的示例。我需要将其扩展到大约240个单元和8年的每日数据 在R中的这种查找/匹配练习似乎总是让我着迷。必须有一个明显的方法来做到这一点,但我现在遇到了阻碍,没有一些真正的蛮力加入等 df1我们可以使用left\u-join,group\u-byunitID和locationID并取t
df1我们可以使用left\u-join
,group\u-by
unitID
和locationID
并取tmax的mean
library(dplyr)
df1 %>%
left_join(df2, by = c("locationID" = "id")) %>%
group_by(unitID, locationID) %>%
summarise(tmx = mean(tmax, na.rm = TRUE))
# unitID locationID tmx
# <chr> <chr> <dbl>
# 1 98008 USC00454169 30.5
# 2 98008 USW00024234 30.5
# 3 98008 USW00094248 28
# 4 98008 USW00094290 28
# 5 98065 USC00451233 -5.5
# 6 98065 USC00458508 -19.5
# 7 98065 USR0000WFTA -3
# 8 98065 USS0021B60S -33.5
# 9 98146 USC00454169 30.5
#10 98146 USW00024233 19.5
#11 98146 USW00024234 30.5
#12 98146 USW00094248 28
#13 98584 USC00451939 44.5
#14 98584 USC00455086 33.5
#15 98584 USW00094227 38.5
我们可以使用data.table
join
library(data.table)
setDT(df1)[setDT(df2), on = .(locationID = id)][,
.(tmx = mean(tmax, na.rm = TRUE)), .(unitID, locationID)]
#. unitID locationID tmx
# 1: 98008 USW00094290 28.0
# 2: 98008 USW00094248 28.0
# 3: 98146 USW00094248 28.0
# 4: 98008 USW00024234 30.5
# 5: 98146 USW00024234 30.5
# 6: 98008 USC00454169 30.5
# 7: 98146 USC00454169 30.5
# 8: 98065 USC00458508 -19.5
# 9: 98065 USS0021B60S -33.5
#10: 98065 USR0000WFTA -3.0
#11: 98065 USC00451233 -5.5
#12: 98146 USW00024233 19.5
#13: 98584 USW00094227 38.5
#14: 98584 USC00451939 44.5
#15: 98584 USC00455086 33.5
多亏了下面的两个答案,我很快就能用下面的方法实现这一点,这样我就可以得到每日平均温度<代码>r df1%>%左加入(df2,by=c(“位置id”=“id”))%>%group\U by(单位id,日期)%>%汇总(tmx=平均值(tmax,na.rm=TRUE))
aggregate(tmax~unitID + locationID,
merge(df1, df2, by.x = "locationID", by.y = "id", all.x = TRUE),
mean, na.rm = TRUE)
library(data.table)
setDT(df1)[setDT(df2), on = .(locationID = id)][,
.(tmx = mean(tmax, na.rm = TRUE)), .(unitID, locationID)]
#. unitID locationID tmx
# 1: 98008 USW00094290 28.0
# 2: 98008 USW00094248 28.0
# 3: 98146 USW00094248 28.0
# 4: 98008 USW00024234 30.5
# 5: 98146 USW00024234 30.5
# 6: 98008 USC00454169 30.5
# 7: 98146 USC00454169 30.5
# 8: 98065 USC00458508 -19.5
# 9: 98065 USS0021B60S -33.5
#10: 98065 USR0000WFTA -3.0
#11: 98065 USC00451233 -5.5
#12: 98146 USW00024233 19.5
#13: 98584 USW00094227 38.5
#14: 98584 USC00451939 44.5
#15: 98584 USC00455086 33.5