首页 > 解决方案 > 计算 R 中两个变量的平均比率的最佳方法是什么?

问题描述

假设我想找到数据集中两个变量的比率(然后最终根据数据集中的第三个变量找到比率的聚合平均值)。解决此问题的最佳方法是什么?目前,我正在尝试使用一个同时存在 NA 和零值的大型数据集,并且我尝试的所有内容最终都输出 Infinity(我假设是因为存在零)。

标签: r

解决方案


欢迎来到 Stackoverflow。请添加您正在使用的数据或使您的问题/问题可在下次问题中重现的数据。这样我们可以提供更具体的帮助。当我正确理解时,您的数据如下所示:

df <- tibble::tribble(
  ~V1, ~V2, ~V3,
   1L,  3L, "a",
   3L,  4L, "a",
   2L,  0L, "b",
  54L,  0L, "b",
   6L,  8L, "a",
   3L,  5L, "c",
   3L,  NA, "c"
  )

df

# A tibble: 7 x 3
     V1    V2 V3   
  <int> <int> <chr>
1     1     3 a    
2     3     4 a    
3     2     0 b    
4    54     0 b    
5     6     8 a    
6     3     5 c    
7     3    NA c

并且想要计算两个变量(此处为 V1 和 V2)之间的比率,然后计算由另一个变量(V3)分组的平均比率。一种方法是:

df %>% 
  mutate(ratio = V1 / na_if(V2, 0)) %>% 
  group_by(V3) %>% 
  summarise(mean = mean(ratio, na.rm = TRUE))

# A tibble: 3 x 2
  V3    mean_ratio
  <chr>      <dbl>
1 a          0.611
2 b        NaN    
3 c          0.6  

na_if()通过用 NA 替换零来处理除以 0 的问题。

根据评论编辑:

如果 V1 和 V2 都有要排除的 NA 值,mutate 函数会是什么样子?我以为你想排除 0?na_if()如上所述,将 0 替换为 NA 以防止被零除。NA 被排除在mean函数中,因为是 set na.rm = TRUE。您可以na_if(V1, 0)在 V1 中用 NA 替换 0,但为什么要这样做呢?

这是一种使用基础 R 的方法:

df$ratio <- df$V1 / ifelse(df$V2 == 0, NA, df$V2) 

aggregate(df$ratio, list(group = df$V3), FUN = function(x) mean(x, na.rm = TRUE))

请确保您在将它们作为作业提交之前了解这些函数在做什么:) 如果您不了解某个函数在做什么,请键入?function_name(例如,?aggregate)阅读文档。


推荐阅读