首页 > 解决方案 > 如何根据 R 中的变量对值进行加权?

问题描述

所以我有这样的数据

df <- structure(list(USER = c(1, 1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5), 
    timestamp = structure(c(1614179957.06, 1614181158, 1614181757, 
    1614181938, 1614185926, 1614185987, 1614196768.466, 1614205951.597, 
    1614206076, 1614210969.716, 1614210971.501, 1614210977.449
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), source = c("A", 
    "B", "A", "B", "B", "V", "C", "A", "A", "B", "H", "A"), event = c(NA, 
    NA, NA, "y", NA, "y", "y", NA, "y", NA, NA,"y")), row.names = c(NA, 
-12L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x000001f74a701ef0>, sorted = c("USER", 
"timestamp"))

看起来像这样...

USER    timestamp   source  event
1   2/24/21 15:19   A   
1   2/24/21 15:39   B   
1   2/24/21 15:49   A   
1   2/24/21 15:52   B       y
2   2/24/21 16:58   B   
2   2/24/21 16:59   V       y
3   2/24/21 19:59   C       y
4   2/24/21 22:32   A   
4   2/24/21 22:34   A       y
5   2/24/21 23:56   B   
5   2/24/21 23:57   H       
5   2/24/21 23:58   A       y

我基本上是在尝试为每个来源分配权重。所以我想使用 dplyr 创建一个新列,它根据与事件的距离(y)对行进行加权

所以特别是我想看到这两种方式:

  1. 该行越靠近事件行,它的价值就越高,实际上是时间衰减。其中event = y的行是最接近事件发生的行。

所以在这种情况下USER =1,你看......

USER    timestamp   source  event  weight
1   2/24/21 15:19   A              .1
1   2/24/21 15:39   B              .2
1   2/24/21 15:49   A              .3
1   2/24/21 15:52   B       y      .4
  1. 第一个和最后一个事件重量最大,其他所有重量都较低(U形)

所以在这种情况下USER =1,你看......

USER    timestamp   source  event  weight
1   2/24/21 15:19   A              .4
1   2/24/21 15:39   B              .1
1   2/24/21 15:49   A              .1
1   2/24/21 15:52   B       y      .4

标签: rdplyrtidyverse

解决方案


下面的代码使用这两个条件创建权重列。
对于第二种方式,它使用了一个辅助函数f,以使代码更具可读性。

library(dplyr)

f <- function(n){
  if(n > 1L){
    m <- c(n, rep(1L, n - 2L), n)
    m/sum(m)
  } else 1L
}
df %>%
  group_by(USER) %>%
  mutate(weight1 = seq_along(event)/sum(seq_along(event)),
         weight2 = f(n()))
## A tibble: 12 x 6
## Groups:   USER [5]
#    USER timestamp           source event weight1 weight2
#   <dbl> <dttm>              <chr>  <chr>   <dbl>   <dbl>
# 1     1 2021-02-24 15:19:17 A      NA      0.1     0.4  
# 2     1 2021-02-24 15:39:18 B      NA      0.2     0.1  
# 3     1 2021-02-24 15:49:17 A      NA      0.3     0.1  
# 4     1 2021-02-24 15:52:18 B      y       0.4     0.4  
# 5     2 2021-02-24 16:58:46 B      NA      0.333   0.5  
# 6     2 2021-02-24 16:59:47 V      y       0.667   0.5  
# 7     3 2021-02-24 19:59:28 C      y       1       1    
# 8     4 2021-02-24 22:32:31 A      NA      0.333   0.5  
# 9     4 2021-02-24 22:34:36 A      y       0.667   0.5  
#10     5 2021-02-24 23:56:09 B      NA      0.167   0.429
#11     5 2021-02-24 23:56:11 H      NA      0.333   0.143
#12     5 2021-02-24 23:56:17 A      y       0.5     0.429

推荐阅读