我可以使用 group_map 或 group_walk 来迭代导出结果吗?

问题描述

我想使用 group_walk() 或 group_map() 作为导入批量 .csv 文件的替代方法来迭代处理比较的主列表。

我想输入一个如下所示的数据集:

测试分析 Var1 Var2 频率
检测 1 否定 否定 19
检测 1 否定 位置 5
检测 1 位置 否定 8
检测 1 位置 位置 141
Assay2 否定 否定 25
Assay2 否定 位置 6
Assay2 位置 否定 17
Assay2 位置 位置 33
Assay3 否定 否定 99
Assay3 否定 位置 20
Assay3 位置 否定 5
Assay3 位置 位置 105

我想使用函数epi_analysis 并为每个测试分析(在本例中为Assay1、Assay2 和Assay3)导出一个csv。到目前为止,我有

#Make export directory
check_create_dir <- function(the_dir) {
  if (!dir.exists(the_dir)) {
    dir.create(the_dir,recursive = TRUE) } #Creates a directory if it doesn't already exist
}

the_dir_ex <- "data_generated/epidata" #Name the new desired directory

check_create_dir(the_dir_ex) #Make the directory if it doesn't already exist

#Make function for the series of analyses
epi_analysis <- function(.x,the_dir){
  #Clean data
  dat2 <- .x  %>%
    select(c(Var1,Var2,Freq)) %>%
    pivot_wider(Var1,names_from = Var2,values_from = Freq) %>%
    remove_rownames %>% 
    column_to_rownames( var = "Var1") %>% 
    as.matrix() 
  
  #Run tests
  rval <- epi.tests(dat2,conf.level = 0.95)
  rkappa<-epi.kappa(dat2)
  gwet <- gwet.ac1.table(dat2)
  kappa2 <- kappa2.table(dat2)
  
  #Export results
  hd <- c('sensitivity','specificity','pfp','pfn','kappa','gwet','pabak')
  ests <- c(round(rval$elements$sensitivity$est,digits = 3),round(rval$elements$specificity$est,round(rval$element$pfp$est,round(rval$element$pfn$est,round(kappa2$coeff.val,round(gwet$coeff.val,round(rkappa$pabak$est,digits = 3))
  cis <- c(paste(round(rval$elements$sensitivity$lower,round(rval$elements$sensitivity$upper,sep = ","),paste(round(rval$elements$specificity$lower,round(rval$elements$specificity$upper,paste(round(rval$element$pfp$lower,round(rval$element$pfp$upper,paste(round(rval$element$pfn$lower,round(rval$element$pfn$upper,kappa2$coeff.ci,gwet$coeff.ci,paste(round(rkappa$pabak$lower,round(rkappa$pabak$lower,"))
  
  df <- data.frame(hd,ests,cis)
  
  write.csv(df,file = paste0(the_dir,"/",basename(.x$TestAssay)),na = "999.99",row.names = FALSE)
  
}


#Use group_map or group_walk to iterate through the different assays in the dataset.

data <- read_csv("data_raw/EpiTest.csv") %>%
  group_by(TestAssay)%>%
  group_map(~ epi_analysis)

但是我的 Epidata 文件夹中没有 csv。欢迎提出任何建议/更正。

解决方法

您需要在 group_map 中调用您的函数。该函数还需要两个参数,因此也传递 the_dir_ex

使用这个功能-

library(tidyverse)
library(epiR)
library(irrCAC)


epi_analysis <- function(.x,the_dir){
dat2 <- .x  %>%
  select(c(Var1,Var2,Freq)) %>%
  pivot_wider(Var1,names_from = Var2,values_from = Freq) %>%
  remove_rownames %>% 
  column_to_rownames( var = "Var1") %>% 
  as.matrix() 

#Run tests
rval <- epi.tests(dat2,conf.level = 0.95)
rkappa<-epi.kappa(dat2)
gwet <- gwet.ac1.table(dat2)
kappa2 <- kappa2.table(dat2)

#Export results
hd <- c('sensitivity','specificity','pfp','pfn','kappa','gwet','pabak')
ests <- c(round(rval$elements$sensitivity$est,digits = 3),round(rval$elements$specificity$est,round(rval$element$pfp$est,round(rval$element$pfn$est,round(kappa2$coeff.val,round(gwet$coeff.val,round(rkappa$pabak$est,digits = 3))
cis <- c(paste(round(rval$elements$sensitivity$lower,round(rval$elements$sensitivity$upper,sep = ","),paste(round(rval$elements$specificity$lower,round(rval$elements$specificity$upper,paste(round(rval$element$pfp$lower,round(rval$element$pfp$upper,paste(round(rval$element$pfn$lower,round(rval$element$pfn$upper,kappa2$coeff.ci,gwet$coeff.ci,paste(round(rkappa$pabak$lower,round(rkappa$pabak$lower,"))

df <- data.frame(hd,ests,cis)

write.csv(df,file = sprintf('%s/%s.csv',the_dir,.x$TestAssay[1]),na = "999.99",row.names = FALSE)

}

并用 -

调用它
read_csv("data_raw/EpiTest.csv") %>%
  group_by(TestAssay)%>%
  group_map(~epi_analysis(.,the_dir_ex),.keep = TRUE)
,

我们可以使用

library(dplyr)
library(readr)
library(purrr)
read_csv("data_raw/EpiTest.csv") %>%
   group_split(TestAssay) %>%
   map(~ epi_analysis(.x,the_dir_ex))