R 基于列条件连接数据帧行

R 基于列条件连接数据帧行,r,dataframe,R,Dataframe,对于后续讨论,我将参考下面的示例数据框: 现在,我希望实现的是对所有相似的数据包时间进行分组,即所有7秒、12秒等。此外,PacketTime字段应包含最小值和最大值的差异(max(PacketTime)-min(PacketTime)),以及FrameLen,IPLen和TCPLen字段应该是与分组时间对应的所有值的列表。例如,对于7s组,FrameLen将包含c(304276276) 我对上述问题的解决方案如下: df <- packets %>% group_by(rou

对于后续讨论,我将参考下面的示例数据框:

现在,我希望实现的是对所有相似的数据包时间进行分组,即所有7秒、12秒等。此外,
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