r - 在R中将基于年份的向量与基于年份和月份的矩阵相乘
问题描述
我有两个数据框
df1
Year Farm 1 Farm 2 Farm 3
2015 1000 2000 1500
2016 500 2000 1000
df 2
Year Month Farm 1 Farm 2 Farm 3
2015 Jan 1 1 3
2015 Feb 1 2 1
2016 Jan 2 2 2
2016 Feb 2 1 2
我想根据年份将 df2 中各个农场的 df1 中的年度值相乘,以便输出为...
df 3
Year Month Farm 1 Farm 2 Farm 3
2015 Jan 1000 2000 4500
2015 Feb 1000 4000 1500
2016 Jan 1000 4000 2000
2016 Feb 1000 2000 2000
我已经正确格式化了这些年,但一直在努力寻找 dplyr 中 group_by 的解决方案。我应该尝试不同的路径吗?
解决方案
1) Base R假设df1
并df2
在最后的注释中重复显示,合并数据帧给出数据帧m
。然后通过用的相同列和 的相应列的乘积df3
替换除前两个列之外的所有列来创建一个新的数据框。不使用任何包。d2
df2
m
m <- merge(df2, df1, by = 1)
df3 <- replace(df2, -(1:2), df2[-(1:2)] * m[-(1:ncol(df2))] )
给予:
> df3
Year Month Farm1 Farm2 Farm3
1 2015 Jan 1000 2000 4500
2 2015 Feb 1000 4000 1500
3 2016 Jan 1000 4000 2000
4 2016 Feb 1000 2000 2000
2) sqldf如果您只有几个农场,以便将它们分别写出来是可行的:
library(sqldf)
sqldf("select
Year,
b.Month,
a.Farm1 * b.Farm1 Farm1,
a.Farm2 * b.Farm2 Farm2,
a.Farm3 * b.Farm3 Farm3
from df2 b left join df1 a using (Year)")
给予:
Year Month Farm1 Farm2 Farm3
1 2015 Jan 1000 2000 4500
2 2015 Feb 1000 4000 1500
3 2016 Jan 1000 4000 2000
4 2016 Feb 1000 2000 2000
笔记
Lines1 <- "
Year Farm1 Farm2 Farm3
2015 1000 2000 1500
2016 500 2000 1000"
Lines2 <- "
Year Month Farm1 Farm2 Farm3
2015 Jan 1 1 3
2015 Feb 1 2 1
2016 Jan 2 2 2
2016 Feb 2 1 2"
df1 <- read.table(text = Lines1, header = TRUE)
df2 <- read.table(text = Lines2, header = TRUE)
推荐阅读
- http - 什么时候可以在 GET http 请求的请求行上有相对 URL?
- c# - 如何将列表写入文本文件。每行写 50 个项目
- python - 组合列表以获取项目组的最有效方法 <= 但尽可能接近长度 X
- ios - 如何在没有双重身份验证的情况下支付苹果开发者帐户?
- ios - CGPatternDrawPatternCallback 未在 iOS 12 /Objective C 中调用
- c# - 大字符串值的 App.config 可读性
- reactjs - React props 中的继承
- django - 如何在 Django REST Framework 中使用瞬时请求控制器模式?
- javascript - 如何在 vis.js 时间轴中使用自定义语言环境
- matlab - Matlab中如何旋转一个复数