r - 在 R 数据框中,如何广播与维度相对应的列?

标签 r merge dataframe aggregate

我有一个 R 数据框:

# here just define it directly, but it comes from a simulation
simPrice <- data.frame(simId=c(1,1,2,2), 
                       crop=rep(c('apple','pear'),2), 
                       mean=rep(c(10,22),2), 
                       sd=rep(c(2,4),2), 
                       price=c(9,21,12,18))

    simId   crop mean sd price
  1     1  apple   10  2     9
  2     1   pear   22  4    21
  3     2  apple   10  2    12
  4     2   pear   22  4    18

这是模拟的两个不同迭代中水果(苹果和梨)的价格。一般来说,我可能有任意数量的水果或迭代。至关重要的是,我可能还有其他列(例如品种、销售日期、销售地点等)。

我有另一个数据框,给出了许多农场种植的水果量:
# here just define it directly, but it comes from a simulation
simVol  <- data.frame(simId=c(1,1,1,1,2,2,2,2), 
                      farm=rep(c('farm A', 'farm A', 'farm B', 'farm B'),2),
                      crop=rep(c('apple','pear'),4), 
                      mean=rep(c(10,22),4), 
                      sd=rep(c(2,4),4), 
                      volume=c(9,21,12,18,10,22,11,19))

  simId   farm  crop mean sd volume
1     1 farm A apple   10  2      9
2     1 farm A  pear   22  4     21
3     1 farm B apple   10  2     12
4     1 farm B  pear   22  4     18
5     2 farm A apple   10  2     10
6     2 farm A  pear   22  4     22
7     2 farm B apple   10  2     11
8     2 farm B  pear   22  4     19

现在我想将这些相乘。

我认为要做到这一点,我必须先“广播”simPricefarm s 以便两个数据帧具有完全相同的顺序。

我的解决方案是这样的:
broadcast <- function(origDf, broadcast_dimList) {
    newDimDf <- do.call(expand.grid, broadcast_dimList);
    nReps <- nrow(newDimDf);
    # replicate each line of the original dataframe in place
    result <- origDf[sort(rep(row.names(origDf), nReps)), 1:ncol(origDf)]
    # add the new dimensions, repeated for each simId
    result <- cbind(newDimDf, result);
    # rename rows sequentially
    row.names(result)<-NULL; 
    return(result);
}

bcastSimPrice <- broadcast(simPrice, list(farm=c('farm A','farm B')))

    farm simId  crop mean sd price
1 farm A     1 apple   10  2     9
2 farm B     1 apple   10  2     9
3 farm A     1  pear   22  4    21
4 farm B     1  pear   22  4    21
5 farm A     2 apple   10  2    12
6 farm B     2 apple   10  2    12
7 farm A     2  pear   22  4    18
8 farm B     2  pear   22  4    18

这有效,但它给我留下了现在试图匹配 bcastSimPrice 行的问题。 (农场在裁剪之前增加)与 simVol 的行(另一种方式)。

有没有另一种方法来解决这个问题?

谢谢!

最佳答案

这是 dplyr 的解决方案。首先我们设置数据(我假设在您的卷数据中包含 sd 和 mean 是错误的)

simPrice <- data.frame(
  simId = c(1, 1, 2, 2),  
  crop = rep(c('apple', 'pear'), 2),  
  mean = rep(c(10, 22), 2),  
  sd = rep(c(2, 4), 2),  
  price = c(9, 21, 12, 18),
  stringsAsFactors = FALSE
)

simVol  <- data.frame(
  simId = c(1, 1, 1, 1, 2, 2, 2, 2),  
  farm = rep(c('farm A', 'farm A', 'farm B', 'farm B'), 2), 
  crop = rep(c('apple', 'pear'), 4),  
  volume = c(9, 21, 12, 18, 10, 22, 11, 19),
  stringsAsFactors = FALSE
)

接下来我们将两个数据集连接在一起(连接是此任务比合并更常见的描述)。我在这里使用 left_join()它始终保留左侧的所有行。 mutate()添加新列,和 %.%将操作串在一起。
library(dplyr)

rev <- simPrice %.% 
  left_join(simVol, by = c("simId", "crop")) %.%
  mutate(revenue = volume * price)
rev

您还可以分组和聚合
rev %.%
  group_by(simId, crop, farm) %.%
  summarise(revenue = sum(revenue))

您可能会发现 dplyr 很有用,因为它命名了最常见的数据分析操作。 introductory vignette提供更多细节。

关于r - 在 R 数据框中,如何广播与维度相对应的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21574608/

相关文章:

scala - Spark 窗口分区功能将永远完成

python - Pandas数据框如何删除和重命名列

从输入字段中删除标签

r - 如何更改 visreg 中交互图的颜色和线型

r - 在 R 中创建某个矩阵

maven - 为多模块 Maven 项目合并 Git 流修补程序的最佳工具

python - 使用 Python 从 DataFrame 中的列溢出值

r - 在 r 中循环 ggplot2 公式

带数字键的 PHP array_merge_recursive

sql - 在SQL中合并2个表并保存到1个新表中