r - 根据所有可能的组合将来自不同数据帧的数字相乘
问题描述
我有 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
并乘以以下内容:
- 来自 df_year 的类别 1 (1.61)
- 来自 df_cat 的 A 类 (1.11)
- 来自 df_bin 的类别 1 (1.42)
- 来自 df_cat2 的 A 类(0.11)
这种组合的答案是 1.11 x 1.61 x 1.11 x 1.42 x 0.11 = 0.3098。第二行显示下一个可能的组合,依此类推。
我不知道如何实现这一点,所以任何帮助将不胜感激!
解决方案
也许你可以尝试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
推荐阅读
- phpmyadmin - 登录
- python - python中缺失值的标准例外是什么?
- php - 通过ajax将查询字符串作为字符串传递
- python - 一个形状为 (15000, 250) 的目标数组被传递为形状为 (None, 1) 的输出,同时用作损失`binary_crossentropy`。我该怎么办?
- json - json 文件上的 Jinja2 模板
- reactjs - 无法使用 Context API 检索对象 AsyncStorage 的值
- shopify - Shopify 临时站点
- laravel - 如何制作没有重定向到页面 404 laravel 的 slug
- javascript - 从 OAuth 回调重定向到弹出行为
- flutter - 我正在尝试从 VS 代码在模拟器上运行我的颤振应用程序,但我收到一条错误消息,说它找不到我的 main.dart 文件的路径