r - 在多个条件上使用匹配以在 R 中生成值
问题描述
我目前有以下数据格式:
df = data.frame(c(rep("A", 12), rep("B", 12)), rep(1:12, 2), seq(-12, 11))
colnames(df) = c("station", "month", "mean")
df
df_master = data.frame(c(rep("A", 10), rep("B", 10)), rep(c(27:31, 1:5), 2), rep(c(rep(1, 5), rep(2, 5)), 2), rep(seq(-4,5), 2))
colnames(df_master) = c("station", "day", "month", "value")
df_master
实际上 df 是每个站点的月平均值,我想在 df_master 数据集中计算一个新变量,该变量计算每个每日观测值与月平均值的差异。我已经设法通过包含所有数据的总体平均值来做到这一点,但是由于每个站点的平均值不同,所以我想使新的变量站点具体化。
我尝试了以下代码来匹配每月值,但这目前不考虑跨站差异:
df_master$mean = df$mean[match(df_master$month, df$month)]
df_master = df_master %>% mutate(diff = value - mean)
我怎样才能进一步推进,以便在每个站点上取平均值?
解决方案
如果将它们转换为 data.tables,则可以使用更新连接添加差异列,df_master
在两者的df
值相等的条件下连接。station
month
library(data.table)
setDT(df_master)
setDT(df)
df_master[df, on = .(station, month),
diff_monthmean := value - i.mean]
df_master
# station day month value diff_monthmean
# 1: A 27 1 -4 8
# 2: A 28 1 -3 9
# 3: A 29 1 -2 10
# 4: A 30 1 -1 11
# 5: A 31 1 0 12
# 6: A 1 2 1 12
# 7: A 2 2 2 13
# 8: A 3 2 3 14
# 9: A 4 2 4 15
# 10: A 5 2 5 16
# 11: B 27 1 -4 -4
# 12: B 28 1 -3 -3
# 13: B 29 1 -2 -2
# 14: B 30 1 -1 -1
# 15: B 31 1 0 0
# 16: B 1 2 1 0
# 17: B 2 2 2 1
# 18: B 3 2 3 2
# 19: B 4 2 4 3
# 20: B 5 2 5 4
推荐阅读
- vue.js - 渲染时设置 vue-swatches 子组件的颜色
- airflow - 有没有办法通过 SimpleHttpOperator 在 Airflow 中通过 REST 上传文件?
- vue.js - Vue路由器,无法读取未定义的属性“推送”
- javascript - 函数返回自身,意外行为
- html - 如何在具有响应式模板的相对包装器中将 div 位置绝对设置到右侧?
- node.js - 如何在 LoopBack 4 中进行数据库迁移
- php - 致命错误:未捕获的TypeError:safeQuery()的返回值必须是数组或null类型,返回bool
- python - StreamConn unsubscribe() 和 close() 似乎不起作用(AlpacaAPI),寻求意见
- javascript - 删除和添加新的 HTML 标记
- python - Matlab 上的 bwlabeln 和 Python 上的 skimage.measure.label 之间的性能差异?