【问题标题】:calculated weighted average in r based on two columns基于两列计算的 r 中的加权平均值
【发布时间】:2019-07-21 07:31:50
【问题描述】:

我有一个数据框如下:

date              Rank         new_Weight       c
2019-01-01         20           2               10
2019-01-01         30           5               10 
2019-01-01         10           8               10
2019-02-02          3           10               60
2019-02-02          5            2               60
....               ...          ....

我想根据排名和新权重计算加权平均值 我已经应用了以下代码:

by(df, df$date,subset) function(x){
  x<-df$rank*df$new_weight/sum(df$new_weigth)
}

并创建一个新列。

我编写了以下函数,它运行良好。

df<- df %>% group_by(date) %>% mutate(w=weighted.mean(rank,new_weight))

但是我想知道为什么第一个功能不起作用。

【问题讨论】:

  • 你不能只使用weighted.mean()函数吗? with(df, weighted.mean(Rank, new_Weight)).
  • 你的意思是在函数中我使用 weigted.mean() 而不是我写的函数。
  • 在你的函数中有参数x,你还需要一个包含x的表达式。

标签: r function


【解决方案1】:

此示例是否回答了您的问题?

 date<-c(2017, 2017, 2018, 2019, 2018, 2019)
 rank<-c(10, 12, 13, 11, 14, 15)
 weight<- c(1.5, 1.1, 1.2, 1.3, 1.4, 1.7)
 df<-data.frame(date, rank, weight)
 df
 df<- df %>% group_by(date) %>% mutate(w=weighted.mean(rank,new_weight))

您不需要任何函数来执行此操作;)

【讨论】:

  • 但是这一次不考虑group_by日期计算?是吗?
  • 不,你的电话df&lt;- df %&gt;% group_by(date) %&gt;% mutate(w=weighted.mean(rank,new_weight)) 完美地完成了这项工作;)
  • 是的,但是我如何解决第一个函数的问题,因为我写的第二个函数回答了这个问题
  • 看看这里 [link] (stackoverflow.com/questions/31431322/…) 这似乎是一个相对的问题。
【解决方案2】:

我认为使用by 你想要做的是引用x 作为数据框而不是df。计算加权平均值的公式也需要改变

by(df, df$date, function(x) sum(x$Rank * x$new_Weight)/sum(x$new_Weight))

#df$date: 2019-01-01
#[1] 18
#--------------------------------------------------------------------------------- 
#df$date: 2019-02-02
#[1] 3.333333

这与应用weighted.mean相同

by(df, df$date, function(x) weighted.mean(x$Rank, x$new_Weight))

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 2012-06-14
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2018-03-10
    相关资源
    最近更新 更多