我有一个dataframedf,其示例如下所示。我需要通过study_id,lab_study_dt和lab_study_time来组合行,并且在由这三个关键变量分组的同一行上具有跨实验室和检测限的NA和非NA值。
group by和summarise_all我试着这样做,但没有得到结果我在找。
df %>%
group_by(study_id,lab_study_dt,lab_study_time) %>%
summarise_all(funs(toString(na.omit(.))))
<表类>study_id lab_study_dt lab_study_time lab_polys lab_lymphs lab_mono lab_eos lab_basos lab_bands lab_wbc_count lab_rbc_count protein_limit_of_detection lab_protein gluc_limit_of_detection lab_glucose tbody><<tr>简 8/13/2011 0:12 NA NA NA NA NA NA 1 NA NA NA NA NA 简8/13/2011 0:12 NA NA NA NA NA NA NA NA NA NA NA NA 简3/4/2013 15:27 NA 60 NA NA NA NA NA NA NA NA NA NA 简3/4/2013 15:27 NA NA NA NA NA NA NA 10000 NA NA NA NA 简3/4/2013 15:27 8 NA NA NA NA NA NA NA NA NA NA NA 简3/4/2013 15:27 NA NA NA NA NA 1 NA NA NA NA NA NA 简3/4/2013 15:27 NA NA NA NA NA NA 149 NA NA NA NA NA 简3/4/2013 15:27 NA NA 31日 NA NA NA NA NA 1 56 NA NA 乔治4/20/2021 21:18 NA 60 NA NA NA NA NA NA NA NA NA NA 乔治4/20/2021 21:18 NA NA NA NA NA NA NA 10000 NA NA NA NA 乔治4/23/2021 15:27 8 NA NA NA NA NA NA NA NA NA 2 3 乔治4/23/2021 27 NA 65 NA NA NA NA NA NA 1 祝辞10 NA NA 乔治4/23/2021 27 NA NA NA NA NA 1 149 NA NA NA NA NA 乔治4/23/2021 27 NA NA 31日 NA NA NA NA 56 NA NA NA NA 表类>
我们可以按id/dt/time
分组,然后在所有列(即everything()
)上使用tidyr::fill
来获取任何非na值,并首先通过任何NAs向下复制它们,然后通过任何NAs向上复制它们("downup",我的任意选择)。最后,我们可以在每个组中只保留第一个切片,然后删除分组。
library(tidyverse)
df %>%
group_by(study_id,lab_study_dt,lab_study_time) %>%
fill(everything(), .direction = "downup") %>%
slice(1) %>%
ungroup()
这是您期望的输出吗?
# A tibble: 5 × 15
study_id lab_study_dt lab_study_time lab_polys lab_lymphs lab_mono lab_eos lab_basos lab_bands lab_wbc_count lab_rbc_count protein_limit_of_detection lab_protein gluc_limit_of_detecti… lab_glucose
<chr> <chr> <chr> <int> <int> <int> <lgl> <lgl> <int> <int> <int> <int> <chr> <int> <int>
1 George 4/20/2021 21:18 NA 60 NA NA NA NA NA 10000 NA NA NA NA
2 George 4/23/2021 12:27 NA 65 31 NA NA 1 149 56 1 >10 NA NA
3 George 4/23/2021 15:27 8 NA NA NA NA NA NA NA NA NA 2 3
4 Jane 3/4/2013 15:27 8 60 31 NA NA 1 149 10000 1 56 NA NA
5 Jane 8/13/2011 0:12 NA NA NA NA NA NA 1 NA NA NA NA NA