如何基于时间窗口上的相似性和R或python中的因子值创建一对值
我有以下格式的CSV文件如何基于时间窗口上的相似性和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
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。:-)