[英]Combining multiple rows for one ID into one row with multiple columns based on 2 different variables in R
我正在使用 R 中的 dataframe ,如下所示:
id <- c(1,1,1,2,2,3,3,3,3)
dx_code <- c("MI","HF","PNA","PNA","Cellulitis","MI","Flu","Sepsis","HF")
dx_date <- c("7/11/22","7/11/22","8/1/22","8/4/22","8/7/22","8/4/22","7/11/22","7/11/22","9/10/22")
df <- data.frame(id, dx_code, dx_date)
df
我希望能夠對其進行分組,以便每個患者 ID 都有他們被看到的每個日期以及他們在每個特定日期收到的每個診斷。 所以它看起來像:
id2 <- c(1,2,3)
dx_date1 <- c("7/11/22","8/4/22","8/4/22")
dx_date1code1 <- c("MI","PNA","MI")
dx_date1code2 <- c("HF",NA,NA)
dx_date2 <- c("8/1/22","8/7/22","7/11/22")
dx_date2code1 <- c("PNA","Cellulitis","Flu")
dx_date2code2 <- c(NA,NA,"Sepsis")
dx_date3 <- c(NA,NA,"9/10/22")
dx_date3code1 <- c(NA,NA,"HF")
df2 <- data.frame(id2, dx_date1, dx_date1code1,dx_date1code2,dx_date2,dx_date2code1,dx_date2code2,dx_date3,dx_date3code1)
df2
我不確定如何以這種方式重新格式化它 - R 中是否有 function,或者我應該嘗試使用 for 循環? 我將不勝感激 - 非常感謝!
經過一些修改后,我們可以使用一個pivot_longer
,然后是一個pivot_wider
。
library(tidyr)
df3 <- df %>% group_by(id) %>%
mutate(
dx_code =paste('code', row_number()),
dx_date =paste('date', row_number())) %>%
pivot_longer(cols = c('dx_code', 'dx_date')) %>%
mutate(value = ifelse(grepl('code', name), dx_code, dx_date)) %>%
group_by(id, name) %>% mutate(
name = paste(name, row_number()))
id name value
<dbl> <chr> <chr>
1 1 dx_code 1 MI
2 1 dx_date 1 7/11/22
3 1 dx_code 2 PNA
4 1 dx_date 2 8/4/22
我們現在擁有適合pivot_wider
格式的數據。
df3 %>% pivot_wider(names_from = name, values_from = value)
# Groups: id [3]
id `dx_code 1` `dx_date 1` `dx_code 2` `dx_date 2` `dx_code 3` `dx_date 3` `dx_code 4` `dx_date 4`
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 MI 7/11/22 PNA 8/4/22 Cellulitis 8/4/22 NA NA
2 2 MI 7/11/22 PNA 8/4/22 NA NA NA NA
3 3 MI 7/11/22 PNA 8/4/22 Cellulitis 8/4/22 Flu 7/11/22
我相信您可以為此使用pivot_wider
。 output 與原始帖子中的不同,但與您在評論中提供的內容相似。
您可以使用row_number()
按id
分組后枚舉日期和代碼。
使用pivot_wider
后,您可以根據包含的數值select
列名稱,這將重新排序,以便日期和代碼列彼此相鄰。
library(tidyverse)
df %>%
group_by(id) %>%
mutate(code_num = row_number()) %>%
pivot_wider(id_cols = id,
names_from = code_num,
values_from = c(dx_date, dx_code)) %>%
select(id, names(.)[-1][order(readr::parse_number(names(.)[-1]))])
Output
id dx_date_1 dx_code_1 dx_date_2 dx_code_2 dx_date_3 dx_code_3 dx_date_4 dx_code_4
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 7/11/22 MI 7/11/22 HF 8/1/22 PNA NA NA
2 2 8/4/22 PNA 8/7/22 Cellulitis NA NA NA NA
3 3 8/4/22 MI 7/11/22 Flu 7/11/22 Sepsis 9/10/22 HF
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.