首页 > 解决方案 > R操作除以分组求和序列中的非零观测值的数量

问题描述

我正在尝试解决一个问题,该问题涉及一对项目在组中出现的比例总和。问题是我以前的帖子的后续,可以在这里找到

我的数据如下:

data <- data.frame(group = c(1,1,1,1,2,2,2,2,3,3,3,3),
                   item = c("Wheat", "Coal", "Steel", "Iron", "Wheat", "Coal", "Steel", "Iron", "Wheat", "Coal", "Steel", "Iron"),
                   quantity = c(5,10,0,5,20,5,10,0,0,10,15,15),
                   proportion = c(0.25,0.5,0,0.25,0.57,0.14,0.29,0,0,0.25,0.375,0.375))

我使用上一个问题中用户建议的以下dplyr操作

result.rep <- crossing(item1 = data$item,
                       item2 = data$item,
                       group = data$group) %>%
  filter(item1 < item2) %>%
  left_join(data, by = c("item1" = "item", "group")) %>%
  left_join(data, by = c("item2" = "item", "group")) %>%
  mutate(interrelation = proportion.x * proportion.y / 3) %>%
  group_by(item1, item2) %>%
  dplyr::summarize(result = sum(interrelation), .groups = "drop")

我仍然面临的问题是,在真实数据中,我有 115 个不同的项目,而不是可重现数据中的 4 个。同样在真实数据中,某些项目从未出现在同一组中。因此,我除以的数字(在可重现的示例中为 3)应该在实际数据中有所不同,具体取决于观察到的组内有多少非零对。

我修改了原始的可重现数据以包括变化非零对的问题:

data <- data.frame(group = c(1,1,1,1,2,2,2,2,3,3,3,3),
                   item = c("Wheat", "Coal", "Steel", "Iron", "Wheat", "Coal", "Steel", "Iron", "Wheat", "Coal", "Steel", "Iron"),
                   quantity = c(5,10,0,5,20,5,0,0,0,10,15,15),
                   proportion = c(0.25,0.5,0,0.25,0.8,0.2,0,0,0,0.25,0.375,0.375))

在修改后的数据中,Wheat 和 Steel 永远不会同时出现在具有非零值的同一组中。因此,这些项目可能具有的非零对数为 2(小麦 - 煤,小麦 - 铁)。而对于项目 Coal,它有 3 个非零对(煤 - 小麦、煤 - 铁、煤 - 钢),因为它以非零值与其他每个项目一起出现在一个组中至少一次。

总之,除数应根据每个项目具有的非零对的数量而变化。

求和序列中是否存在循环操作来解释这种特殊性?

标签: rdplyrstatisticssumsummarize

解决方案


推荐阅读