dplyr:Summary()中的用户定义函数,涉及两个输入向量

dplyr:Summary()中的用户定义函数,涉及两个输入向量,r,dplyr,weighted-average,R,Dplyr,Weighted Average,我有一个数据框,比如说20列。第1列是组,第2列不是标准化为1或100的权重,第3到20列包含要聚合的数据。大约有250行,但只有15组。因此,平均而言,每组大约有16-17行 对于第3列到第20列中的每一列,我需要得到分组加权平均值,权重为第2列 因此,将所有列乘以第2列,然后运行 group_by(df, column1)%>% summarise_all(sum_na) 这里的sum_na是na.rm=T的常用函数sum 然后将第3列到第20列除以第2列 问题是数据帧中分散着

我有一个数据框,比如说20列。第1列是组,第2列不是标准化为1或100的权重,第3到20列包含要聚合的数据。大约有250行,但只有15组。因此,平均而言,每组大约有16-17行

对于第3列到第20列中的每一列,我需要得到分组加权平均值,权重为第2列

因此,将所有列乘以第2列,然后运行

group_by(df, column1)%>%

  summarise_all(sum_na)
这里的sum_na是na.rm=T的常用函数sum

然后将第3列到第20列除以第2列

问题是数据帧中分散着NAs。例如,第150行属于第5组,第12列中有NA。在计算第5组和第12列的加权平均值时,分母应排除第2列第150行的权重


如何做到这一点?抱歉发了这么长的邮件。无法提供示例数据,因为不幸的是,无法从手机在office发布中访问堆栈溢出。

是否需要此工作

library(dplyr)

df %>%
  group_by(group) %>%
  summarise_at(vars(col1:col18), ~weighted.mean(., wt, na.rm = TRUE))
可以在变量中选择列的范围。这将删除列col1到col18中的NA值,其中权重列为wt

在该示例中尝试了以下操作:

df <- data.frame(group = rep(1:3, each  = 3), wt = 1:9, 
                 col1 = c(2:5, NA, 6:9), col2  = c(NA, 3:6, NA, 2:4))

df %>%
 group_by(group) %>%
 summarise_at(vars(col1:col2), ~weighted.mean(., wt, na.rm = TRUE))

#  group  col1  col2
#  <int> <dbl> <dbl>
#1     1  3.33  3.6 
#2     2  5.6   5.56
#3     3  8.08  3.08
我们可以使用data.table方法


请共享一个可复制的示例以及预期输出,以便在尝试运行此操作之前进行确认。假设第23行只有一列有NA。即使所有列都有值,该行是否会被删除?@Dayne否。从该列计算时,仅忽略NA值。因此,该行不起作用。它显示了相同的误差,即加权平均值中x和w的长度不相等。你在权重列中也有NA吗?在这种情况下,您需要执行类似df%>%filter的操作!is.nawt%>%group\u bygroup%>%summary\u atvarscol1:col2,~weighted.means.,wt,na.rm=TRUE@Dayne regrape2 is。您可能想改用tidyr。我想类似的东西应该可以用df%>%pivot\u longercols=col1:col18,values\u drop\u na=TRUE%>%group\u bygroup,name%>%summariseans=weighted.meanvalue,wt
library(data.table)
setDT(df)[, lapply(.SD, function(x) weighted.mean(x, wt, na.rm = TRUE)), 
       by = group, .SDcols = col1:col18]