试试这个dplyr 解决方案:
library(dplyr)
dat %>%
group_by(Time) %>%
mutate(
Cardiac.Rhythm = if_else(nzchar(Cardiac.Rhythm), Cardiac.Rhythm, NA_character_),
across(-Row, ~ .[order(is.na(.))])
) %>%
ungroup() %>%
filter(rowSums(!is.na(.)) > 2) %>%
as.data.frame()
# Row Time Base.excess..vt. Glucose.ABG Lactate.ABG PaCO2 PaO2 PH..ABG. Potassium.ABG Sodium.ABG Cardiac.Rhythm Arterial.Pressure.Diastolic Arterial.Pressure.Mean Arterial.Pressure.Systolic Heart.Rate
# 1 1 2017-09-04 17:00:00 -11.4 11.8 10.7 4.42 31.5 7.25 3.9 3.9 ST NA NA NA NA
# 2 10 2017-09-04 17:55:00 NA NA NA NA NA NA NA NA <NA> 54 68 92 123
# 3 14 2017-09-04 18:00:00 NA NA NA NA NA NA NA NA ST 60 71 86 123
# 4 23 2017-09-04 19:00:00 -9.3 10.1 9.7 4.22 15.0 7.30 3.9 3.9 ST 58 70 92 122
# 5 36 2017-09-04 20:00:00 -8.4 8.1 7.2 5.07 16.9 7.27 3.9 3.9 ST 62 80 117 NA
(我截断了粘贴在这里的列...)
演练:
- 由于某种原因,
Cardiac.Rhythm 有空字符串而不是 NA,第一个 mutate 将空字符串 "" 转换为 NA,以便后面的过滤起作用;
-
.[order(is.na(.))] 在每列中将非NA 数据排在首位;
-
rowSums(.) 确保我们在一行中至少有一个非NA 数据(> 2 考虑到Row 和Time 不是NA)。
注意事项:
- 我假设数据是每帧一个“人”;如果您的数据中有患者 ID,请务必将其添加到
group_by(.) 中。
- 在特定的
Time(和Patient_ID,如果存在)中,我假设行的顺序并不重要(因此每列重新排序值)。
- 我确实不假设每一列每个
Time 只能有一个值;虽然从逻辑上讲这种情况是有道理的,但在此之前的数据抓取/聚合中也可能存在错误,所以我故意不假设x[!is.na(x)](按Time分组时)总是会返回长度 1。这将作为特定 Time 中的两行(或更多行)。
- 我考虑过为此使用
pivot_longer,但它仍然可能,但是......你这里有numeric和character数据,所以整理出来有点问题好吧。
数据
dat <- structure(list(Row = 1:47, Time = c("2017-09-04 17:00:00", "2017-09-04 17:00:00", "2017-09-04 17:00:00", "2017-09-04 17:00:00", "2017-09-04 17:00:00", "2017-09-04 17:00:00", "2017-09-04 17:00:00", "2017-09-04 17:00:00", "2017-09-04 17:00:00", "2017-09-04 17:55:00", "2017-09-04 17:55:00", "2017-09-04 17:55:00", "2017-09-04 17:55:00", "2017-09-04 18:00:00", "2017-09-04 18:00:00", "2017-09-04 18:00:00", "2017-09-04 18:00:00", "2017-09-04 18:00:00", "2017-09-04 18:00:00", "2017-09-04 18:00:00", "2017-09-04 18:00:00", "2017-09-04 18:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 19:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00", "2017-09-04 20:00:00" ), Base.excess..vt. = c(-11.4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, -9.3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, -8.4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Glucose.ABG = c(NA, 11.8, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 10.1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 8.1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Lactate.ABG = c(NA, NA, 10.7, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 9.7, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 7.2, NA, NA, NA, NA, NA, NA, NA, NA, NA), PaCO2 = c(NA, NA, NA, 4.42, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 4.22, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 5.07, NA, NA, NA, NA, NA, NA, NA, NA), PaO2 = c(NA, NA, NA, NA, 31.5, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 15, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 16.9, NA, NA, NA, NA, NA, NA, NA), PH..ABG. = c(NA, NA, NA, NA, NA, 7.25, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 7.3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 7.27, NA, NA, NA, NA, NA, NA), Potassium.ABG = c(NA, NA, NA, NA, NA, NA, 3.9, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3.9, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3.9, NA, NA, NA, NA, NA), Sodium.ABG = c(NA, NA, NA, NA, NA, NA, 3.9, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3.9, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3.9, NA, NA, NA, NA, NA), Cardiac.Rhythm = c("", "", "", "", "", "", "", "", "ST", "", "", "", "", "", "", "", "ST", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ST", "", "", "", "", "", "", "", "", "", "", "", "", "ST"), Arterial.Pressure.Diastolic = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 54L, NA, NA, NA, 60L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 58L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 62L, NA, NA, NA), Arterial.Pressure.Mean = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 68L, NA, NA, NA, 71L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 70L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 80L, NA, NA), Arterial.Pressure.Systolic = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 92L, NA, NA, NA, 86L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 92L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 117L, NA ), Heart.Rate = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 123L, NA, NA, NA, NA, 123L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 122L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Non.Invasive.Arterial.Pressure.Diastolic = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 58L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Non.Invasive.Arterial.Pressure.Mean = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 71L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Non.Invasive.Arterial.Pressure.Systolic = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 108L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Tympanic.Temperature = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 37.6, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Patient.Positioning.ABG = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Central.Venous.Pressure = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Delivered.Percent.O2 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Mean.Airway.Pressure.S = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Minute.Volume.expired..S. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Peak.Inspiratory.Pressure.measured..S = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Positive.End.Expiratory.pressure = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), S.Expired.Tidal.vol...breath. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), S.Tidal.Volume.Inspired = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Servo.i.Modes = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Set.FiO2 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Set.Flow.Trigger.S = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA ), Set.Pause.time.. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Set.PEEP.Servo = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA ), Set.rate..CMV.or.SIMV. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Set.Tidal.Volume..servo. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Set.Upper.Pressure.Limit = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Spontaneous.Rate..S = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Cardiac.output..Vigileo. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), DO2.Vigileo. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), DO2I.Vigileo. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Stroke.Volume.Index.Vigileo. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Stroke.Volume.Vigileo. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Systemic.Vascular.Resistance.Index.Vigileo. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Systemic.Vascular.Resistance.Vigileo. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Ionised.Calcium.ABG = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Set.Pressure.Control.level.above.PEEP.S. = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -47L))