我对R来说是个新手,所以我可能很难问我的问题。请容忍我。
我有两个数据帧。让我们为了解释而假装:
df1
列代表收益类型:玉米、燕麦、小麦等。行代表一年中的月份,一月、二月等。元素代表在特定月份购买的收益类型的每吨价格。
df2
代表国家的栏:西班牙、智利、墨西哥等。这一栏表示处理该国的额外费用,可能是:包装费用、运输费用、国家进口税、检验费等。
现在我想构建第三个数据框架:
df3
它代表谷物组合的总成本(例如10%的玉米,50%的燕麦,.)考虑到所有国家的航运、税收等相关费用,假设每个月都有一个等式(使用df1和df2的数据)计算给定的谷物组合的每个国家每月总成本以及每个国家的额外费用。
为了简洁起见,让我们假设三月份总成本的一部分,西班牙是
cost <- .10 * df1[ “mar”,”oats”] + df2[“tax”,”Spain”] + .....我可以直接选择第二个数据帧的元素,并对第一个数据帧的列进行算术以获得结果。对于某一特定国家:
cost <- .10 * df1[ ,”oats”] + df2[“tax”,”Spain”] + .....这给了我西班牙每个月的费用。
问题是:我必须对每个国家重复相同的算法。
另一个版本:
cost <- .10 * df1[ ,”oats”] + df2[“tax”,] + .....给出了每个国家的费用,但只给我一月份的费用。
我想要一套公式,给出所有县每月的总费用。换句话说,df3的行数将与df1 (月份)相同,列数将与df2 (countries)相同。
编辑..。张贴在一个封闭的问题中的例子:
# 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发布于 2012-09-10 15:59:55
您有两种选择:一种是使用outer函数,从df2的冒号中提供“月份”向量和“国家”向量的输入,并使用从df1和df2中提取“成本”组件的函数。(无法让这种方法发挥作用)你会得到一个‘月’x‘国家’矩阵。另一种方法是转换df2数据,并使用all=TRUE与df1合并,获得“长”格式的数据,您可以使用公式进行列操作,然后将其重塑为“国家”中的“宽”格式。详细信息将取决于特定的数据设置,您还没有提供一个示例。
这将为您提供一个12×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)https://stackoverflow.com/questions/12354581
复制相似问题