繁体   English   中英

根据其他数据框的功能创建新的数据框

[英]create new data frame from a function of other data frames

我是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 (国家)相同。

编辑...粘贴在封闭问题中的示例中:

# 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

您有两种选择:一种是使用outer函数从df2的同名中提供“ month”向量和“ 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM