我是R的新手,我可能很难问我的问题。请耐心等待。
我有两个数据框。我们假装是为了解释:
DF1
列代表收益类型:玉米,燕麦,小麦等。 行代表一年中的月份,jan,feb等。 元素表示在该特定月份购买的该增益类型的每吨价格。
DF2
代表国家/地区的列:西班牙,智利,墨西哥等 此框架的行代表了处理该国家/地区的额外费用,可能: 每个国家的包装成本,运输成本,国家进口税,检验费等。
现在我想构建第三个数据框:
DF3
它代表谷物组合的总成本(例如10%玉米,50%燕麦,......)与所有国家的运输,税收等相关费用,每个月假设那里是一个等式(使用来自df1和df2的数据)来计算给定谷物组合每个国家/地区每月的总成本以及每个国家的额外成本。
为了简洁起见,让我们说一下3月总成本的等式,西班牙是
cost <- .10 * df1[ “mar”,”oats”] + df2[“tax”,”Spain”] + .....
我可以直接选择第二个数据帧的元素,并使用第一个数据帧的列进行算术运算以获得结果。对于特定国家/地区:
cost <- .10 * df1[ ,”oats”] + df2[“tax”,”Spain”] + .....
这给了我西班牙每个月的费用
问题是:我必须为每个国家重复相同的算术。
另一个版本:
cost <- .10 * df1[ ,”oats”] + df2[“tax”,] + .....
给我每个国家的费用,但仅限1月份
我想要一组方程式,它给出了所有县的每月总费用。换句话说,df3
与df1
(月)的行数相同,与df2
(国家/地区)的列数相同。
编辑...以封闭式问题发布的示例粘贴:
# build df1 - cost of grains (with goofy data so I can track the arithemetic)
v1 <- c(1:12)
v2 <- c(13:24)
v3 <- c(25:36)
v4 <- c(37:48)
grain <- data.frame("wheat"=v1,"oats"=v2,"corn"=v3,"rye"=v4)
grain
# build df2 - additional costs (again, with goofy data to see what is being used where and when)
w1 <- c(1.3:4.3)
w2 <- c(5.3:8.3)
w3 <- c(9.3:12.3)
w4 <- c(13.3:16.3)
cost <- data.frame("Spain"=w1,"Peru"=w2,"Mexico"=w3,"Kenya"=w4)
row.names(cost) <- c("packing","shipping","tax","inspection")
cost
# assume 10% wheat, 30% oats and 60% rye with some clown-equation for total cost
# now for my feeble attempt at getting a dataframe that has 12 rows (months) and 4 column (countries)
total_cost <- data.frame( 0.1*grain[,"wheat"] +
0.3*grain[,"oats"] +
0.6*grain[,"rye"] +
cost["packing","Mexico"] +
cost["shipping","Mexico"] +
cost["tax","Mexico"] +
cost["inspection","Mexico"] )
total_cost
答案 0 :(得分:1)
你有几个选择:一个是使用outer
函数提供'月'矢量的输入和来自df2的colnames的'country'矢量,并使用一个函数来拉动''来自df1和df2的成本'组件。 (无法使用这种方法。)你会得到一个'月'x'国家'矩阵。另一种方法是转换df2数据帧并使用all = TRUE进行合并,df1获得一个“长”格式数据帧,您可以使用公式对列进行列操作,然后重塑为“国家/地区”中“宽”的格式。详细信息将取决于具体的数据设置,但您尚未提供示例。
这将为您提供12 x 4网格的月份和国家组合:
dfrm <- expand.grid(grain$months, colnames(cost) )
这将为您提供一个函数,该函数需要一个月值和一个国家/地区值并计算上面的表达式:
costcros <- function(x) { sum(grain[ grain[, 'months'] == x[1], c(1,2,4)]*c(0.1,0.3,0.6) ) +
sum( cost[, x[2]]) }
这会将计算添加到dfrm的每一行:
dfrm$crosscost <- apply(expand.grid(grain$months, colnames(cost) ), 1, costcros)