通过 By 函数加权平均
Weighted mean through the By function
我正在努力调整我编写的函数,这让我很头疼,所以我想 post 在这里。
在我使用 R 的 "by" 函数的函数中,它将数据帧放入子集中并在其上运行一个函数。
现在我正在扩展函数以包括 weighted.mean(来自 'descr' 包)并且我收到一个错误,指出 x 和 w 的长度不相等。
一些要显示的代码:
set.seed(100)
d1 <- rnorm(300)
d2 <- (floor(runif(100, min=1, max=4)))
weight <- rnorm(300,mean = 1, sd = 1)
df <- cbind.data.frame(d1,d2,weight)
df$d2 <- factor(df$d2,
levels = c(1,2,3,4),
labels = c("red", "blue", "green","orange"))
require('descr')
by(df$d1, df$d2, function(x) mean(x=x, na.rm=TRUE))
by(df$d1, df$d2, function(x) weighted.mean(x=x,w=df$weight na.rm=TRUE))
所以我正在制作一个数据框,其中包含 1 个数值、1 个具有 4 个级别的因子,尽管只有 3 个具有数据(例如 missing/fitlered 数据)和一个权重变量。
第 8 个命令是我现在拥有的,但现在我还需要增加它的重量。
所以这给了我每种颜色的平均值。对于我没有任何数据的 d2 级别,它也是 returns NA,这正是我所需要的。 (因为我正在处理不同的数据集并且需要合并结果,所以重要的是所有定义的级别也被输出。)
第 9 个命令(其中带有 weighted.mean 的命令)returns x/w 的长度不同的错误。
这是因为by为每块df$d2创建一个df$d1的子集,但是weighted.mean(x=x, w = weight,...)中的权重是整个变量而不是部分的子集。
我一直在尝试查看weighted.mean的代码,看看我是否可以重写它,但没有找到解决方案。随时欢迎任何帮助。
诀窍是使用整个 data.frame 作为输入除以索引
by(data = df, INDICES = df$d2, FUN = function(dfgroup) {
weighted.mean(x = dfgroup$d1, w = dfgroup$weight, na.rm=TRUE)
})
我正在努力调整我编写的函数,这让我很头疼,所以我想 post 在这里。
在我使用 R 的 "by" 函数的函数中,它将数据帧放入子集中并在其上运行一个函数。
现在我正在扩展函数以包括 weighted.mean(来自 'descr' 包)并且我收到一个错误,指出 x 和 w 的长度不相等。
一些要显示的代码:
set.seed(100)
d1 <- rnorm(300)
d2 <- (floor(runif(100, min=1, max=4)))
weight <- rnorm(300,mean = 1, sd = 1)
df <- cbind.data.frame(d1,d2,weight)
df$d2 <- factor(df$d2,
levels = c(1,2,3,4),
labels = c("red", "blue", "green","orange"))
require('descr')
by(df$d1, df$d2, function(x) mean(x=x, na.rm=TRUE))
by(df$d1, df$d2, function(x) weighted.mean(x=x,w=df$weight na.rm=TRUE))
所以我正在制作一个数据框,其中包含 1 个数值、1 个具有 4 个级别的因子,尽管只有 3 个具有数据(例如 missing/fitlered 数据)和一个权重变量。
第 8 个命令是我现在拥有的,但现在我还需要增加它的重量。 所以这给了我每种颜色的平均值。对于我没有任何数据的 d2 级别,它也是 returns NA,这正是我所需要的。 (因为我正在处理不同的数据集并且需要合并结果,所以重要的是所有定义的级别也被输出。)
第 9 个命令(其中带有 weighted.mean 的命令)returns x/w 的长度不同的错误。 这是因为by为每块df$d2创建一个df$d1的子集,但是weighted.mean(x=x, w = weight,...)中的权重是整个变量而不是部分的子集。
我一直在尝试查看weighted.mean的代码,看看我是否可以重写它,但没有找到解决方案。随时欢迎任何帮助。
诀窍是使用整个 data.frame 作为输入除以索引
by(data = df, INDICES = df$d2, FUN = function(dfgroup) {
weighted.mean(x = dfgroup$d1, w = dfgroup$weight, na.rm=TRUE)
})