微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 df 从列表中分离出来

如何解决如何将 df 从列表中分离出来

我有一个 df lst1 的列表。我想为每个主题 ID 生成一个 excel 文件,每个文件将包含多个工作表,它等于 lst 中的 df。最后,我想在 lst 中来自 dfs 的 col 名称添加标签

lst<-list(Demographics = structure(list(SubjectID = c("101-01-101","101-02-102","101-03-103","101-04-104","104-05-201"),BRTHDTC = c("1953-07-07","1963-07-02","1940-09-11","1955-12-31","1950-12-04"),SEX = c("Female","Female","Male","Female")),row.names = c(NA,-5L),class = c("tbl_df","tbl","data.frame")),diseaseStatus = structure(list(SubjectID = c("101-01-101",DSDT = c("2016-03-14","2017-04-04",NA,"2016-05-02","2018-07-06"),DSDT_P = c(NA,"UN-UNK-2015",NA)),Visits = structure(list(SubjectID = c("101-01-101",Visit = c("Screening: -28 Days to Day 1","Screening: -28 Days to Day 1","Screening: -28 Days to Day 1"
),VISND = c(NA_character_,NA_character_,NA_character_)),"data.frame")))

Label<-structure(list(Var = c("SubjectID","BRTHDTC","SEX","DSDT","DSDT_P","Visit","VISND"),label = c("Subject ID","Birthday","Gender","DS Date","DS Date Prob","Date of Visit","ND Visit"
)),-7L),"data.frame"))

IDlist = c("101-01-101","104-05-201")

结果应该看起来像……

out
$Demographics
# A tibble: 2 x 3
  SubjectID  BRTHDTC    SEX   
  <chr>      <chr>      <chr> 
1 Subject ID Birthday   Gender
2 101-01-101 1953-07-07 Female


$diseaseStatus
# A tibble: 2 x 3
  SubjectID  DSDT       DSDT_P      
  <chr>      <chr>      <chr>       
1 Subject ID DS Date    DS Date Prob
2 101-01-101 2016-03-14 <NA>        
       

$Visits
# A tibble: 2 x 3
  SubjectID  Visit                        VISND   
  <chr>      <chr>                        <chr>   
1 Subject ID Date of Visit                ND Visit
2 101-01-101 Screening: -28 Days to Day 1 <NA>    

我拥有的代码是:

Indivadual_xlsx<-function(Subject_id){
lst %>% map(~ {nm1 <- deframe(Label)[names(.x)];  filter(.,SubjectID == Subject_id) %>% 
    bind_rows(as.list(setNames(names(nm1),nm1)),setNames(.,nm1))  })%>%
     write.xlsx(paste0(Subject_id,".xlsx"))
}
IDlist %>% map(Indivadual_xlsx) 

解决方法

我们可以在用 transpose 完成 match 之后 deframe

library(dplyr)
library(purrr)
library(tibble)
lst1 <- map(lst,~ .x %>%
              split(.$SubjectID) %>%
               map(~ bind_rows(as.list(deframe(Label)[names(.x)]),.x) )) %>% 
       transpose 

-检查

第一个 list 元素的输出

lst1[[1]]
$Demographics
# A tibble: 2 x 3
  SubjectID  BRTHDTC    SEX   
  <chr>      <chr>      <chr> 
1 Subject ID Birthday   Gender
2 101-01-101 1953-07-07 Female

$DiseaseStatus
# A tibble: 2 x 3
  SubjectID  DSDT       DSDT_P      
  <chr>      <chr>      <chr>       
1 Subject ID DS Date    DS Date Prob
2 101-01-101 2016-03-14 <NA>   

$Visits
# A tibble: 2 x 3
  SubjectID  Visit                        VISND   
  <chr>      <chr>                        <chr>   
1 Subject ID Date of Visit                ND Visit
2 101-01-101 Screening: -28 Days to Day 1 <NA>    

然后,我们通过循环 write.xlsx

list 元素上使用 list
library(openxlsx)
imap(lst1,~ write.xlsx(.x,file.path("C:/document",sprintf("subject_%s.xlsx",.y))))

excel 文件名将是“IDlist”元素的名称,工作表名称将是内部列表元素的名称,即“Demographics”、“DiseaseStatus”和“Visits”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。