我有一个df,看起来像下表。我需要将血压生命体征行分为两个独立的生命体征行。读作";"收缩压";(较高的数字(和另一个读作"0"的数字;舒张压";(较低的数字(。
患者 | 生命体征 | 数字时间 | //tr>
---|---|---|
1 | 氧气 | 98日期/时间|
1 | 心率 | 72日期/时间|
1 | 血压 | 120/80日期/时间 | [/tr>
2 | 氧气 | 92日期/时间|
2 | 心率 | 103日期/时间
从tidyr
:使用separate_rows
library(tidyverse)
dat %>%
separate_rows(Number)
# A tibble: 6 x 4
Patient Vital.sign Number time
<int> <chr> <chr> <chr>
1 1 oxygen 98 date/time
2 1 Heart rate 72 date/time
3 1 Blood pressure 120 date/time
4 1 Blood pressure 80 date/time
5 2 Oxygen 92 date/time
6 2 Heart rate 103 date/time
我们可以在"数字"列上使用separate_rows
library(dplyr)
library(tidyr)
df1 %>%
separate_rows(Number, convert = TRUE) %>%
mutate(`Vital sign`= replace(`Vital sign`,
`Vital sign` == "Blood pressure",
c("systolic blood pressure", "diastolic blood pressure")))
-输出
# A tibble: 6 × 4
Patient `Vital sign` Number time
<int> <chr> <int> <chr>
1 1 oxygen 98 date/time
2 1 Heart rate 72 date/time
3 1 systolic blood pressure 120 date/time
4 1 diastolic blood pressure 80 date/time
5 2 Oxygen 92 date/time
6 2 Heart rate 103 date/time
数据
df1 <- structure(list(Patient = c(1L, 1L, 1L, 2L, 2L), `Vital sign` = c("oxygen",
"Heart rate", "Blood pressure", "Oxygen", "Heart rate"), Number = c("98",
"72", "120/80", "92", "103"), time = c("date/time", "date/time",
"date/time", "date/time", "date/time")), class = "data.frame", row.names = c(NA,
-5L))