r - weighted.mean, summarise() 和 cross()
问题描述
我想按数字聚合以下数据框(变量 y 和 z)并按“权重”加权。这工作如下:
df = data.frame(number=c("a","a","a","b","c","c"), y=c(1,2,3,4,1,7),
z=c(2,2,6,8,9,1), weight =c(1,1,3,1,2,1))
aggregate = df %>%
group_by(number) %>%
summarise_at(vars(y,z), funs(weighted.mean(. , w=weight)))
由于 summarise_at 不应再使用,因此我尝试使用它。但我没有成功:
aggregate = df %>%
group_by(number) %>%
summarise(across(everything(), list( mean = mean, sd = sd)))
# this works for mean but I can't just change it with "weighted.mean" etc.
解决方案
我们可以通过匿名函数~
。通过检查summarise_at
,OP 只想返回列 'y'、'z' 的摘要,即 usingeverything()
也会返回mean
和'weight' 列sd
,weighted.mean
这没有多大意义
library(dplyr)
df %>%
group_by(number) %>%
summarise(across(c(y, z),
list( mean = mean, sd = sd,
weighted = ~weighted.mean(., w = weight))), .groups = 'drop')
# A tibble: 3 x 7
# number y_mean y_sd y_weighted z_mean z_sd z_weighted
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 a 2 1 2.4 3.33 2.31 4.4
#2 b 4 NA 4 8 NA 8
#3 c 4 4.24 3 5 5.66 6.33
通常,mean
andsd
在没有NA
元素时效果很好。但是如果有NA
值,我们可能需要使用na.rm = TRUE
(默认情况下它是FALSE
. 在这种情况下,lambda 调用对于传递额外的参数很有用
df %>%
group_by(number) %>%
summarise(across(c(y, z),
list( mean = ~mean(., na.rm = TRUE), sd = ~sd(., na.rm = TRUE),
weighted = ~weighted.mean(., w = weight))), .groups = 'drop')
推荐阅读
- ios - 如何在 SwiftUI 中获取 MKMapView 方向
- javascript - 如何让本地通知插件在我的科尔多瓦应用程序上工作?
- sql-server - SQL Server 将 2 个 Unicode 字符解释为相同
- c# - 统一播放多个音频片段
- microsoft-graph-toolkit - 同一页面中带有 Sharepoint Provider 的多个 Web 部件错误
- python - 在 Python 中替代 Sum 函数以获得更好的 LP 时间性能
- c# - 将本地数据库中的日期加载到列表中,错误
- javascript - v-for 不在 DIV 标签上循环,但适用于 TR 标签
- laravel - Laravel 排队作业创建通知
- java - 在 Eclipse 中停止 Minecraft 服务器