簡體   English   中英

根據 R 中的 2 個不同變量將一個 ID 的多行組合成一行多列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM