【发布时间】:2021-10-04 22:30:21
【问题描述】:
所以我有这样的数据
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) 的距离对行进行加权
所以我特别想看到这两种方式:
- 行越靠近事件行,它的价值就越高,实际上是时间衰减。其中
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
- 第一个和最后一个事件的重量最大,其他的重量都较轻(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
【问题讨论】:
-
你要
df %>% arrange(USER, event %in% 'y') %>% group_by(USER) %>% mutate(weight = row_number()/10) -
抱歉@akrun,已更新
-
不完全是,我们需要按时间戳排序。通常
USER的最终时间戳是event =y,但是如果有另一个USER条目但event = y已经过去的情况,那么权重应该是NA -
如果您需要按时间戳订购,只需在排列中添加即可,即
df %>% arrange(USER, timestamp, event %in% 'y') %>% group_by(USER) %>% mutate(weight = row_number()/10) -
看起来可行!!!放弃投票的答案