如何基于时间窗口上的相似性和R或python中的因子值创建一对值

如何基于时间窗口上的相似性和R或python中的因子值创建一对值,python,r,Python,R,我有以下格式的CSV文件 Id =c(1,1,1,1,1,1,2,2,2) ASN =c(15169,15169,1299,15169,15169,1299,15169,1299,1299) Value =c(253,48,17,33,38,46,253,46,40) TimeWindow =c('2017-10-05 17:00:00','2017-10-05 17:00:00','2017-10-05 18:00:00','2017-10-05 19:00:00','2017-10-05 1

我有以下格式的CSV文件

Id =c(1,1,1,1,1,1,2,2,2)
ASN =c(15169,15169,1299,15169,15169,1299,15169,1299,1299)
Value =c(253,48,17,33,38,46,253,46,40)
TimeWindow =c('2017-10-05 17:00:00','2017-10-05 17:00:00','2017-10-05 18:00:00','2017-10-05 19:00:00','2017-10-05 12:00:00','2017-10-05 12:00:00','2017-10-05 17:00:00','2017-10-05 17:00:00','2017-10-05 17:00:00')
sampleData = data.frame(Id, ASN, Value,TimeWindow)
我想为每个用户id的每个相似时间窗口创建一对不同的ASN。让我试着用示例来解释我的意思

id#1的前两行在同一时间窗口中,但不应在同一时间窗口中 被视为一对,因为它们具有相似的ASN值(15169)

id#1的第3行和第4行不是成对的,因为它们不在同一时间窗口中

id#1的第5行和第6行是成对的,因为它们位于同一时间窗口中,具有不同的ASN值

第7行Id#2和第8行和第9行的平均值(平均值,因为它们具有相同的ASN)是成对的(因为它们在同一时间窗口中具有不同的ASN(15169和1299)(2017-10-05 17:00:00)

最终结果如下所示

Id = c(1,1,2,2)
ASN = c(15169,1299,15169,1299)
Value =c(38,46 , 253,43)
TimeWindow = c('2016-10-05 12:00:00','2016-10-05 12:00:00','2016-10-05 17:00:00','2016-10-05 17:00:00')
FinalResult = data.frame(Id,ASN, Value,TimeWindow)
如果您对如何使用R或Python实现这一点有任何想法,我将不胜感激。谢谢。

Id=c(1,1,1,1,1,1,2,2)
Id =c(1,1,1,1,1,1,2,2,2)
ASN =c(15169,15169,1299,15169,15169,1299,15169,1299,1299)
Value =c(253,48,17,33,38,46,253,46,40)
TimeWindow =c('2017-10-05 17:00:00','2017-10-05 17:00:00','2017-10-05 18:00:00','2017-10-05 19:00:00','2017-10-05 12:00:00','2017-10-05 12:00:00','2017-10-05 17:00:00','2017-10-05 17:00:00','2017-10-05 17:00:00')
sampleData = data.frame(Id, ASN, Value,TimeWindow)

library(dplyr)

sampleData %>%
  group_by(Id, TimeWindow, ASN) %>%     # for each combination
  summarise(Value = mean(Value)) %>%    # get the mean value
  filter(n_distinct(ASN) > 1) %>%       # keep the ones that have pairs
  ungroup() %>%                         # forget the grouping
  select(Id, ASN, Value, TimeWindow)    # keep relevant columns

# # A tibble: 4 x 4
#      Id   ASN Value          TimeWindow
#   <dbl> <dbl> <dbl>              <fctr>
# 1     1  1299    46 2017-10-05 12:00:00
# 2     1 15169    38 2017-10-05 12:00:00
# 3     2  1299    43 2017-10-05 17:00:00
# 4     2 15169   253 2017-10-05 17:00:00
ASN=c(15169151691299151691516912991516912991299) 数值=c(253,48,17,33,38,46253,46,40) 时间窗口=c('2017-10-05 17:00:00'、'2017-10-05 17:00:00'、'2017-10-05 18:00:00'、'2017-10-05 19:00:00'、'2017-10-05 12:00:00'、'2017-10-05 17:00:00'、'2017-10-05 17:00:00'、'2017-10-05 17:00:00'、'2017-10-05 17:00:00') sampleData=data.frame(Id、ASN、值、时间窗口) 图书馆(dplyr) 样本数据%>% 每个组合的分组依据(Id、时间窗口、ASN)%>% 总结(值=平均值))%>%#获取平均值 过滤器(n_distinct(ASN)>1)%>%#保留有对的过滤器 取消分组()%>%#忘记分组 选择(Id、ASN、值、时间窗口)#保留相关列 ##tibble:4 x 4 #Id ASN值时间窗口 # # 1 1 1299 46 2017-10-05 12:00:00 # 2 1 15169 38 2017-10-05 12:00:00 # 3 2 1299 43 2017-10-05 17:00:00 # 4 2 15169 253 2017-10-05 17:00:00
Perfect!非常感谢,我不知道dplyr有这么强大。我应该深入研究它。你完全可以使用data.table包和语法来实现这一点。也许有人可以发布data.table解决方案。我只是更倾向于使用dplyr。:-)