我正在尝试根据某些食品商品的进口份额创建一个特定于国家/地区的指数。
我有以下数据:价格包含许多食品商品价格的时间序列数据。权重包含相关商品的特定国家进口份额数据(见模拟数据)。
我想做的是创建一个特定国家的食品价格指数,它是进口商品价格系列乘以进口份额的总和。
因此,在示例数据中,澳大利亚的食品价格指数将是:
FOODct = 0.12 * WHEATt + 0.08 * SUGARt
其中c表示国家和t时间。
所以基本上我的问题是:如何将每个国家的列乘以行?
我对 R 有一些经验,但试图解决这个问题,我似乎超出了我的体重。我也没有在其他地方找到任何有用的指针,所以我希望你们中的任何人都可能有好的建议。
## Code to create mock data:
## Generate data on country weights
country<-c(rep("Australia",2),rep("Zimbabwe",3))
item<-c("Wheat","Sugar","Wheat","Sugar","Soybeans")
itemcode<-c(1,2,1,2,3)
share<-c(0.12,0.08,0.16,0.08,0.03)
weights<-data.frame(country,item,itemcode,share)
## Generate data on price index
date<-seq(as.Date("2005/1/1"),by="month",length.out=12)
Wheat<-runif(12,80,160)
Sugar<-runif(12,110,230)
Soybeans<-runif(12,60,130)
prices<-data.frame(date,Wheat,Sugar,Soybeans)
编辑:解决方案
感谢 alexwhan 的建议(不幸的是,由于缺乏 stackoverflow 街头信誉,我无法投票)。dnlbrky 是最容易用原始数据实现的解决方案。
## Load data.table package
require(data.table)
## Convert data to data table
prices<-data.table(prices)
weights<-data.table(weights,key="item")
## Extract names for all the food commodities
vars<-names(prices)[!names(prices) %in% "date"]
## Unstack items to create table in long format
prices<-data.table(date=prices[,date], stack(prices,vars),key="ind")
## Rename the columns
setnames(prices,c("values","ind"),c("price","item"))
## Calculate the food price index
priceindex<-weights[prices,allow.cartesian=T][,list(index=sum(share*price)),
by=list(country,date)]
## Order food price index if not done automatically
priceindex<-priceindex[order(priceindex$country,priceindex$date),]