首页 > 解决方案 > 取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

如有任何帮助,我将不胜感激!

标签: rdplyr

解决方案


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

推荐阅读