r - 在纵向数据中定义情节
问题描述
我有一个数据集,我想在其中定义“剧集”。如果温度升高或降低至少 15 分钟,则定义为发作。有没有办法在不手动进行的情况下构建它?
这是我的数据结构:
Patient Minute temperature
1 0,00 35,65
1 1,00 35,65
1 2,00 35,66
1 3,00 35,67
1 4,00 35,70
1 5,00 35,72
1 6,00 35,71
1 7,00 35,68
1 8,00 35,66
1 9,00 35,67
1 10,00 35,69
1 11,00 35,72
提前致谢。
解决方案
dplyr
实现它的一种可能性是:
df %>%
mutate(episode = temperature > lag(temperature, default = first(temperature))) %>%
group_by(rleid = with(rle(episode), rep(seq_along(lengths), lengths))) %>%
mutate(episode = (n() >= 4) * episode) %>%
ungroup() %>%
select(-rleid) %>%
left_join(df %>%
mutate(episode = temperature < lag(temperature, default = first(temperature))) %>%
group_by(rleid = with(rle(episode), rep(seq_along(lengths), lengths))) %>%
mutate(episode = (n() >= 4) * episode) %>%
ungroup() %>%
select(-rleid), by = c("Patient" = "Patient",
"Minute" = "Minute",
"temperature" = "temperature")) %>%
mutate(episode = pmax(episode.x, episode.y)) %>%
select(-episode.x, -episode.y)
Patient Minute temperature episode
<int> <dbl> <dbl> <int>
1 1 0 35.6 0
2 1 1 35.6 0
3 1 2 35.7 1
4 1 3 35.7 1
5 1 4 35.7 1
6 1 5 35.7 1
7 1 6 35.7 0
8 1 7 35.7 0
9 1 8 35.7 0
10 1 9 35.7 0
11 1 10 35.7 0
12 1 11 35.7 0
请注意,我将天数从 15 减少到 4(您可以通过修改 中的数字来更改它n() >= 4
),因为您的数据没有包含足够的行来说明那么多天。
它的作用是,它首先比较一行是否具有比前一行更高/更低的“温度”值(对于这两个条件它分别进行)。其次,它围绕这个比较创建一个游程类型组 ID。第三,如果行的条件满足n
(在我的代码中为 4),它会在名为“episode”的变量中分配 1。最后,它结合了第一步的比较结果。
或者,如果您还想区分剧集:
df %>%
mutate(episode = temperature > lag(temperature, default = first(temperature))) %>%
group_by(rleid = with(rle(episode), rep(seq_along(lengths), lengths))) %>%
mutate(episode = (n() >= 2) * episode) %>%
ungroup() %>%
select(-rleid) %>%
left_join(df %>%
mutate(episode = temperature < lag(temperature, default = first(temperature))) %>%
group_by(rleid = with(rle(episode), rep(seq_along(lengths), lengths))) %>%
mutate(episode = ((n() >= 2) * episode + 1) * episode) %>%
ungroup() %>%
select(-rleid), by = c("Patient" = "Patient",
"Minute" = "Minute",
"temperature" = "temperature")) %>%
mutate(episode = pmax(episode.x, episode.y)) %>%
select(-episode.x, -episode.y)
Patient Minute temperature episode
<int> <dbl> <dbl> <dbl>
1 1 0 35.6 0
2 1 1 35.6 0
3 1 2 35.7 1
4 1 3 35.7 1
5 1 4 35.7 1
6 1 5 35.7 1
7 1 6 35.7 2
8 1 7 35.7 2
9 1 8 35.7 2
10 1 9 35.7 1
11 1 10 35.7 1
12 1 11 35.7 1
在这里,使用 2 个窗口,“episode” == 1 表示增加,“episode” == 2 表示减少。
我想你想按“病人”分组,所以你可以这样做:
df %>%
group_by(Patient) %>%
mutate(episode = temperature > lag(temperature, default = first(temperature))) %>%
group_by(Patient, rleid = with(rle(episode), rep(seq_along(lengths), lengths))) %>%
mutate(episode = (n() >= 2) * episode) %>%
ungroup() %>%
select(-rleid) %>%
left_join(df %>%
group_by(Patient) %>%
mutate(episode = temperature < lag(temperature, default = first(temperature))) %>%
group_by(Patient, rleid = with(rle(episode), rep(seq_along(lengths), lengths))) %>%
mutate(episode = ((n() >= 2) * episode + 1) * episode) %>%
ungroup() %>%
select(-rleid), by = c("Patient" = "Patient",
"Minute" = "Minute",
"temperature" = "temperature")) %>%
mutate(episode = pmax(episode.x, episode.y)) %>%
select(-episode.x, -episode.y)
推荐阅读
- pine-script - Pinescript 中基于部分时间的交易退出
- ubuntu - 我无法在 WSL2 开启的 Windows 10 上使用 npm 命令(ubuntu 终端)
- linux - 我如何在 amazon Linux AMI 上找到我的 Linux 发行版?
- python - 将数据框列表中的每个数据框附加到另一个数据框列表中
- javascript - JS倒计时时间不显示
- java - 将 Postgres 连接到 Ballerina,找不到 bre/lib 文件夹
- javascript - 如何将属性的值作为值交换/传递给另一个属性?
- css - 如何更改 ANT Design 的 Spin 组件的颜色?
- c - 修改 gcc 编译以提高嵌入式 Flash 大小
- javascript - 该网站在 iOS 上的工作方式不同,如何解决?