如何聚合同一时间窗口内发生的数据?

问题描述 投票:0回答:1

我有以下数据集:

价值 begin_ms 结束_毫秒 反应
正位 是新的 262432 362232 5
262432 263000 30
公制 A 262432 263000 30
263000 362232 25
公制 B 263000 362232 25

我试图以更整洁的方式创建一个新的数据框,其中我将每次出现的列正交以及在相同的 begin_ms 和 end_ms 中出现的列作为列。我尝试使用

data_spread <- spread(dfgs_final, key = tier, value = value)

但它只部分起作用,看起来像这样:

正位 begin_ms 结束_毫秒 公制 反应
是新的 262432 362232 5
262432 263000 A 30
263000 362232 B 25

有没有办法对正交列的 begin_ms 和 end_ms 内的所有内容进行分组?我心里有这样的想法:

正位 begin_ms 结束_毫秒 公制 反应
是新的 262432 362232 5
是新的 262432 263000 A 30
是新的 263000 362232 B 25
r split aggregate spread
1个回答
0
投票

仅供参考,

spread
自 2019 年 8 月(4.5 年前)以来已退休/被取代,其替代品
pivot_wider
功能更强大,我建议您研究一下。等效的就是这个
pivot_wider
,我正在为第二个代码块添加一个
id
字段。

library(dplyr)
library(tidyr)
wide <- pivot_wider(quux, id_cols = c("begin_ms", "end_ms", "reaction"),
                    names_from = "tier", values_from = "value") |>
  mutate(id = row_number())
wide
# # A tibble: 3 × 7
#   begin_ms end_ms reaction ortho  words metric    id
#      <int>  <int>    <int> <chr>  <chr> <chr>  <int>
# 1   262432 362232        5 is new NA    NA         1
# 2   262432 263000       30 NA     is    A          2
# 3   263000 362232       25 NA     new   B          3

从这里开始,我们可以对那些没有

is.na(ortho)
的行进行基于范围的连接,重新分配
NA
,然后与数据组合回来。
ortho

最后,您可能更愿意为每行拥有唯一的 
filter(wide, is.na(ortho)) |> right_join(filter(wide, !is.na(ortho)), join_by(between(x$begin_ms, y$begin_ms, y$end_ms), between(x$end_ms, y$begin_ms, y$end_ms)), suffix = c("", ".y")) |> mutate(ortho = ortho.y[id.y]) |> select(id, ortho) |> right_join(wide, by = "id", suffix = c(".y", "")) |> mutate(ortho = coalesce(ortho, ortho.y)) |> select(-ortho.y) |> arrange(id) # # A tibble: 3 × 7 # id begin_ms end_ms reaction ortho words metric # <int> <int> <int> <int> <chr> <chr> <chr> # 1 1 262432 362232 5 is new NA NA # 2 2 262432 263000 30 is new is A # 3 3 263000 362232 25 is new new B

字段;如果您想保留“父级”

id
,我们只需稍加改动即可做到。
id

数据

filter(wide, is.na(ortho)) |> right_join(filter(wide, !is.na(ortho)), join_by(between(x$begin_ms, y$begin_ms, y$end_ms), between(x$end_ms, y$begin_ms, y$end_ms)), suffix = c("", ".y")) |> mutate(ortho = ortho.y[id.y]) |> select(id, parentid = id.y, ortho) |> # THE ONLY CHANGE right_join(wide, by = "id", suffix = c(".y", "")) |> mutate(ortho = coalesce(ortho, ortho.y)) |> select(-ortho.y) |> arrange(id) # # A tibble: 3 × 8 # id parentid begin_ms end_ms reaction ortho words metric # <int> <int> <int> <int> <int> <chr> <chr> <chr> # 1 1 NA 262432 362232 5 is new NA NA # 2 2 1 262432 263000 30 is new is A # 3 3 1 263000 362232 25 is new new B

© www.soinside.com 2019 - 2024. All rights reserved.