首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >摘要()和weighted.mean ()

摘要()和weighted.mean ()
EN

Stack Overflow用户
提问于 2020-08-30 04:28:22
回答 1查看 222关注 0票数 3

我想通过数字聚合以下数据帧(变量y和z),并通过" weight“对其进行加权。它的工作原理如下:

代码语言:javascript
复制
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,所以我用across尝试了一下。但我没有成功:

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-30 04:29:59

我们可以用~传递匿名函数。通过检查重量,OP只想返回列'y','z‘的摘要,也就是说,使用everything()也会返回’summarise_at‘列的meansdweighted.mean,这没有多大意义

代码语言:javascript
复制
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

通常,当没有NA元素时,meansd可以很好地工作。但是如果有NA的值,我们可能需要使用na.rm = TRUE (默认情况下是FALSE )。在这种情况下,lambda调用对于传递额外的参数很有用

代码语言:javascript
复制
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')
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63651494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档