R 基于列条件连接数据帧行
对于后续讨论,我将参考下面的示例数据框: 现在,我希望实现的是对所有相似的数据包时间进行分组,即所有7秒、12秒等。此外,R 基于列条件连接数据帧行,r,dataframe,R,Dataframe,对于后续讨论,我将参考下面的示例数据框: 现在,我希望实现的是对所有相似的数据包时间进行分组,即所有7秒、12秒等。此外,PacketTime字段应包含最小值和最大值的差异(max(PacketTime)-min(PacketTime)),以及FrameLen,IPLen和TCPLen字段应该是与分组时间对应的所有值的列表。例如,对于7s组,FrameLen将包含c(304276276) 我对上述问题的解决方案如下: df <- packets %>% group_by(rou
PacketTime
字段应包含最小值和最大值的差异(max(PacketTime)-min(PacketTime)
),以及FrameLen
,IPLen
和TCPLen
字段应该是与分组时间对应的所有值的列表。例如,对于7s组,FrameLen
将包含c(304276276)
我对上述问题的解决方案如下:
df <- packets %>%
group_by(round(PacketTime)) %>%
summarise(
PTime=max(PacketTime)-min(PacketTime),
FLen=list(FrameLen),
ILen=list(IPLen),
Movement=0
) %>%
rename(PacketTime=PTime) %>%
rename(FrameLen=FLen) %>%
rename(IPLen=ILen)
df$"round(PacketTime)" <- NULL # Remove the group_by
一种方法是使用
seq
和cut
。每5秒创建一个从最小到最大的时间序列。然后,使用cut
将您的时间设置为间隔。您可以通过省略labels
参数来使用标签的间隔,例如:(7-12秒)。或者只使用间隔的较短时间(7秒),如下所示
library(tidyverse)
my_breaks <- seq(trunc(min(packets$PacketTime)), max(packets$PacketTime) + 5, 5)
packets$Interval <- cut(packets$PacketTime, breaks = my_breaks, labels = my_breaks[-length(my_breaks)], right = FALSE)
packets %>%
group_by(Interval) %>%
summarise(
PTime=max(PacketTime)-min(PacketTime),
FLen=list(FrameLen),
ILen=list(IPLen),
Movement=0
) %>%
rename(PacketTime=PTime) %>%
rename(FrameLen=FLen) %>%
rename(IPLen=ILen)
库(tidyverse)
我的车坏了%
总结(
PTime=最大(打包时间)-最小(打包时间),
FLen=列表(框架),
ILen=列表(IPLen),
移动=0
) %>%
重命名(PacketTime=PTime)%>%
重命名(FrameLen=FLen)%>%
重命名(IPLen=ILen)
输出
# A tibble: 7 x 5
Interval PacketTime FrameLen IPLen Movement
<fct> <dbl> <list> <list> <dbl>
1 7 0.0637 <int [3]> <int [3]> 0
2 12 0.0692 <int [3]> <int [3]> 0
3 17 0.0639 <int [3]> <int [3]> 0
4 22 0.0636 <int [3]> <int [3]> 0
5 27 0.0656 <int [3]> <int [3]> 0
6 32 0.0648 <int [3]> <int [3]> 0
7 37 0.0614 <int [2]> <int [2]> 0
#一个tible:7 x 5
间隔打包时间帧IPLen移动
1 7 0.0637 0
2 12 0.0692 0
3 17 0.0639 0
4 22 0.0636 0
5 27 0.0656 0
6 32 0.0648 0
7 37 0.0614 0
这是一个基本的R解决方案,使用聚合+转换
u <- aggregate(
. ~ PacketTime,
transform(df,
PTime = ave(PacketTime, trunc(PacketTime),
FUN = function(x) diff(range(x))), PacketTime = trunc(PacketTime)
),
c
)
dfout <- transform(u, PTime = sapply(PTime, unique))
请先使用dput()
来共享您的一些数据…@Ben更新了OP以包含dput()
感谢您的回答!您能否更深入地解释一下您对前两个变量所做的工作?这样,另一个可能偶然发现这一点的用户可以理解结果是什么!另请注意-我在左侧添加了right=FALSE
,因此间隔很近(意思是大于或等于7秒,而不是仅仅大于7秒-虽然这可能无关紧要…)@rshah也可以使用trunc
而不是round
,这确保7.8秒从7秒开始,而不是从8秒开始。。。
u <- aggregate(
. ~ PacketTime,
transform(df,
PTime = ave(PacketTime, trunc(PacketTime),
FUN = function(x) diff(range(x))), PacketTime = trunc(PacketTime)
),
c
)
dfout <- transform(u, PTime = sapply(PTime, unique))
> dfout
PacketTime FrameLen IPLen TCPLen Movement PTime
1 7 304, 276, 276 300, 272, 272 260, 232, 232 0, 0, 0 0.063683
2 12 304, 276, 276 300, 272, 272 260, 232, 232 0, 0, 0 0.069183
3 17 304, 276, 276 300, 272, 272 260, 232, 232 0, 0, 0 0.063904
4 22 304, 276, 276 300, 272, 272 260, 232, 232 0, 0, 0 0.063627
5 27 304, 276, 276 300, 272, 272 260, 232, 232 0, 0, 0 0.065637
6 32 304, 276, 276 300, 272, 272 260, 232, 232 0, 0, 0 0.064778
7 37 304, 276 300, 272 260, 232 0, 0 0.061367