r - 取R中列组的第一个值
问题描述
我有一些数据:
数据
structure(list(WBC_BASELINE = c(2.9, NA, NA, 6.9, NA, NA, NA,
NA, NA, NA, 7.4, 12.8, NA, NA, NA, NA, NA, 4.2, NA, NA), WBC_FIRST = c(2.4,
14.8, 11, 7.3, 4.5, NA, NA, 6.1, 7.7, 16.2, 5.3, 10.3, 14.5,
NA, NA, 12.8, 3.7, 4.7, 16.6, 9.3), neuts_BASELINE = c(2, NA,
NA, 5.4, NA, NA, NA, NA, NA, NA, 4.96, 8.9, NA, NA, NA, NA, NA,
NA, NA, NA), neuts_FIRST = c(1.5, 13, 5.8, 4.5, 1.6, NA, NA,
1.7, 4.3, 9.3, 3.4, 5.8, 10.1, NA, NA, 9.7, 2.3, 3.5, 5, 8.2)), row.names = c(NA,
20L), class = "data.frame")
在数据集中,我有一些血液测试结果(在这种情况下,WBC 和 neuts 在 2 个时间点采集 - 基线和第一个)。如果存在,我想选择基线值,否则取第一个值。
我可以分别为 WBC 和 neuts 执行此操作,但我想为 20 种不同的血液测试执行此操作,而无需每次都对其进行硬编码...
硬编码方式:
data %>% mutate(WBC_first_value=ifelse(!is.na(WBC_BASELINE), WBC_BASELINE, WBC_FIRST)) %>%
mutate(neuts_first_value=ifelse(!is.na(neuts_BASELINE), neuts_BASELINE, neuts_FIRST))
请注意,每次验血后总是_BASELINE
和_FIRST
如有任何帮助,我将不胜感激!
解决方案
pivot_longer
我们可以使用和pivot_wider
组合使用一些数据整理来自动化这个过程:
library(dplyr)
library(tidyr)
data %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -rn, names_to = c('grp', '.value'),
names_sep = "_") %>%
group_by(grp) %>%
transmute(rn, new = coalesce(BASELINE, FIRST)) %>%
pivot_wider(names_from = grp, values_from = new) %>%
select(-rn) %>%
bind_cols(data, .)
输出:
WBC_BASELINE WBC_FIRST neuts_BASELINE neuts_FIRST WBC neuts
1 2.9 2.4 2.00 1.5 2.9 2.00
2 NA 14.8 NA 13.0 14.8 13.00
3 NA 11.0 NA 5.8 11.0 5.80
4 6.9 7.3 5.40 4.5 6.9 5.40
5 NA 4.5 NA 1.6 4.5 1.60
6 NA NA NA NA NA NA
7 NA NA NA NA NA NA
8 NA 6.1 NA 1.7 6.1 1.70
9 NA 7.7 NA 4.3 7.7 4.30
10 NA 16.2 NA 9.3 16.2 9.30
11 7.4 5.3 4.96 3.4 7.4 4.96
12 12.8 10.3 8.90 5.8 12.8 8.90
13 NA 14.5 NA 10.1 14.5 10.10
14 NA NA NA NA NA NA
15 NA NA NA NA NA NA
16 NA 12.8 NA 9.7 12.8 9.70
17 NA 3.7 NA 2.3 3.7 2.30
18 4.2 4.7 NA 3.5 4.2 3.50
19 NA 16.6 NA 5.0 16.6 5.00
20 NA 9.3 NA 8.2 9.3 8.20
推荐阅读
- python - 如何使用 lxml 和请求在锚点中获取元素文本?
- c++ - C ++:按公共基数对整数进行分组以节省内存
- enums - 如何找到枚举变体的参数数量?
- javascript - 如何在不模糊的情况下拉伸 WebGL 画布?“图像渲染”样式不起作用
- java - 无法连接到 SQL 数据库(Java、Android Studio)
- python - Pandas 按列计算值的频率
- sql-server-2017 - MS SQL Server for Linux 服务变为非活动状态并停止响应
- ios - 将场景加载到 SceneView 时出现 GPU 帧捕获警告?
- sql - 为 MariaDB 的分层查询实现递归 CTE
- php - 如何替换两个不同的多维数组中的字符串?