【问题标题】:Using filter to calculate mean gives wrong value使用过滤器计算均值给出错误值
【发布时间】:2019-12-06 08:56:33
【问题描述】:

我有一个面板数据集,我正在尝试计算不同组的平均值。我使用以下功能:

mean(x = filter(panel, dv_id== 1 )$price, y = filter(panel, dvv_id== 1)$price)

但是,当我使用这个功能时:

panel %>%
    group_by(dv_id, dvv_id) %>%
    dplyr::summarize(Mean = mean(price, na.rm=TRUE))

我确实得到了我正在寻找的组组合的不同平均值。

【问题讨论】:

  • 请与dput分享您的数据
  • @OmarAbdEl-Naser 如何复制数据? df 太大,无法在控制台中完全选择。
  • 只过滤 c(1) 组然后dput

标签: r dplyr mean


【解决方案1】:

它并没有给你错误的值,但是我们错误地使用了这个函数。由于您没有分享可重现的示例,让我们尝试使用mtcars 数据集来理解。

library(dplyr)
#Same as your attempt 
mean(x = filter(mtcars, am == 1 )$mpg, y = filter(mtcars, vs == 1)$mpg) #gives
#[1] 24.39231

现在让我们选择vs == 0

mean(x = filter(mtcars, am == 1 )$mpg, y = filter(mtcars, vs == 0)$mpg)
#[1] 24.39231

答案还是一样,很奇怪。现在让我们添加一个非常大的数字

mean(x = filter(mtcars, am == 1 )$mpg, y = 100000)
#[1] 24.39231

答案仍然相同,这意味着无论您对价值 y 有什么价值,答案都是相同的,因为在计算时只考虑了 x 价值。

mean(x = filter(mtcars, am == 1 )$mpg)
#[1] 24.39231

你可能想要做的是(注意c

mean(c(x = filter(mtcars, am == 1 )$mpg, y = filter(mtcars, vs == 1)$mpg))
#[1] 24.47778

但你确定你想要这个,因为这会分别过滤 amvs,所以可能会有一些重叠。当您使用group_by 时,计算中没有重叠。

mtcars %>%
  group_by(vs, am) %>%
  dplyr::summarise(Mean = mean(mpg))

#    vs    am  Mean
#  <dbl> <dbl> <dbl>
#1     0     0  15.0
#2     0     1  19.8
#3     1     0  20.7
#4     1     1  28.4

vsam 的 1、1 个组合的平均值为 28.4

当你这样做时是一样的

mean(x = filter(mtcars, am == 1 & vs == 1)$mpg)
#[1] 28.37143

我希望这可以解释基本问题,并且您可以使用它来解决您的数据问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多