首页 > 解决方案 > 根据所有可能的组合将来自不同数据帧的数字相乘

问题描述

我有 5 个数据框,如下所示:

df_mon <- data.frame(mon = as.factor(c(6, 7, 8, 9, 10)),
                   number = c(1.11, 1.02, 0.95, 0.92, 0.72))

df_year <- data.frame(year = as.factor(c(1, 2)),
                   number = c(1.61, 0.4))

df_cat <- data.frame(cat = c("A", "B", "C"),
                   number = c(1.11, 1.02, 0.44))

df_bin <- data.frame(bin = as.factor(c(1, 2)),
                      number = c(1.42, 0.56))

df_cat2 <- data.frame(cat2 = c("A", "B", "C", "D", "AA"),
                     number = c(0.11, 1.22, 1.34, 0.88, 0.75))

我需要将每个数据帧中的“数字”列中的所有数字相乘。因此,查看每个数据集中第一列中所有可能的组合,然后取其数量并将它们相乘。最终结果数据框应如下所示(前 3 个已完成)

results_df <- data.frame(combi = c("mon6_year1_catA_bin1_cat2A", "mon6_year1_catA_bin1_cat2B",  "mon6_year1_catA_bin1_cat2C"),
                       final_number = c(1.11*1.61*1.11*1.42*0.11, 1.11*1.61*1.11*1.42*1.22, 1.11*1.61*1.11*1.42*1.34))

我们可以看到显示的第一列results_df是用什么组合来计算的final_number。第一个示例显示,'number'取 (1.11) 中的列mon_df cat 6并乘以以下内容:

这种组合的答案是 1.11 x 1.61 x 1.11 x 1.42 x 0.11 = 0.3098。第二行显示下一个可能的组合,依此类推。

我不知道如何实现这一点,所以任何帮助将不胜感激!

标签: rdata-wrangling

解决方案


也许你可以尝试expand.grid如下

lst <- list(df_mon, df_year, df_cat, df_bin, df_cat2)
results_df <- data.frame(
  combi = do.call(
    paste,
    c(do.call(
      expand.grid,
      lapply(lst, function(v) paste0(names(v[1]), v[, 1]))
    ), sep = "_")
  ),
  final_number = Reduce(
    "*",
    do.call(
      expand.grid,
      lapply(lst, `[[`, 2)
    )
  )
)

这使

> head(results_df)
                        combi final_number
1  mon6_year1_catA_bin1_cat2A   0.30985097
2  mon7_year1_catA_bin1_cat2A   0.28472792
3  mon8_year1_catA_bin1_cat2A   0.26518777
4  mon9_year1_catA_bin1_cat2A   0.25681342
5 mon10_year1_catA_bin1_cat2A   0.20098441
6  mon6_year2_catA_bin1_cat2A   0.07698161

推荐阅读