dplyr:Summary()中的用户定义函数,涉及两个输入向量
我有一个数据框,比如说20列。第1列是组,第2列不是标准化为1或100的权重,第3到20列包含要聚合的数据。大约有250行,但只有15组。因此,平均而言,每组大约有16-17行 对于第3列到第20列中的每一列,我需要得到分组加权平均值,权重为第2列 因此,将所有列乘以第2列,然后运行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列 问题是数据帧中分散着
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]