使用过滤器计算平均值会给出错误的值
Using filter to calculate mean gives wrong value
我有一个面板数据集,我正在尝试计算不同组的平均值。我使用以下函数:
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))
我确实得到了我正在寻找的组组合的不同平均值。
它没有给你错误的值,但我们错误地使用了这个函数。由于您还没有共享可重现的示例,让我们尝试使用 mtcars
数据集来理解。
library(dplyr)
#Same as your attempt
mean(x = filter(mtcars, am == 1 )$mpg, y = filter(mtcars, vs == 1)$mpg) #gives
#[1] 24.39231
现在让我们selectvs == 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
但是您确定要这样做吗,因为这会分别过滤 am
和 vs
,因此可能会有一些重叠。当您使用 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
vs
和 am
的 1、1 组合的平均值为 28.4
这和你做的一样
mean(x = filter(mtcars, am == 1 & vs == 1)$mpg)
#[1] 28.37143
我希望这能解释基本问题,您可以用它来解决您的数据问题。
我有一个面板数据集,我正在尝试计算不同组的平均值。我使用以下函数:
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))
我确实得到了我正在寻找的组组合的不同平均值。
它没有给你错误的值,但我们错误地使用了这个函数。由于您还没有共享可重现的示例,让我们尝试使用 mtcars
数据集来理解。
library(dplyr)
#Same as your attempt
mean(x = filter(mtcars, am == 1 )$mpg, y = filter(mtcars, vs == 1)$mpg) #gives
#[1] 24.39231
现在让我们selectvs == 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
但是您确定要这样做吗,因为这会分别过滤 am
和 vs
,因此可能会有一些重叠。当您使用 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
vs
和 am
这和你做的一样
mean(x = filter(mtcars, am == 1 & vs == 1)$mpg)
#[1] 28.37143
我希望这能解释基本问题,您可以用它来解决您的数据问题。