我有以下数据集:
层 | 价值 | 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 |
仅供参考,
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