[R] Can I use group_map to iteratively process a dataframe?

Madison Bell m@d|@on3be|| @end|ng |rom gm@||@com
Fri Jun 4 16:03:40 CEST 2021


I want to iteratively process a master list of comparisons using
group_walk() as an alternative method to import batches of .csv files.
I have the code for iteratively importing batch csvs here:

#Import list of csv files from directory, formatted as:

|rownm | neg | pos |
|------|-----|-----|
|neg   |19   |18   |
|pos   |5    |141  |

```
library(tidyverse) # for cleaning and shaping data
library(epiR)
library(irrCAC)

all_epi_files <- list.files("congtables", pattern = "*.csv",
                               full.names = TRUE)

#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(a_csv, the_dir){
  #Import data as inserted variables
  dat2 <- read_csv(a_csv)%>%
    remove_rownames %>%
    column_to_rownames(var="rownm") %>%
    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, digits = 3),
            round(rval$element$pfp$est, digits = 3),
            round(rval$element$pfn$est, digits = 3),
            round(kappa2$coeff.val, digits = 3),
            round(gwet$coeff.val, digits = 3),
            round(rkappa$pabak$est, digits = 3))
  cis <- c(paste(round(rval$elements$sensitivity$lower, digits = 3),
round(rval$elements$sensitivity$upper, digits = 3), sep = ","),
           paste(round(rval$elements$specificity$lower, digits = 3),
round(rval$elements$specificity$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfp$lower, digits = 3),
round(rval$element$pfp$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfn$lower, digits = 3),
round(rval$element$pfn$upper, digits = 3), sep = ","),
           kappa2$coeff.ci,
           gwet$coeff.ci,
           paste(round(rkappa$pabak$lower, digits = 3),
round(rkappa$pabak$lower, digits = 3), sep = ","))

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

  write.csv(df,
            file = paste0(the_dir, "/", basename(a_csv)),
            na = "999.99",
            row.names = FALSE)

}


#Execute functions
lapply(all_epi_files,
       FUN = epi_analysis,
       the_dir = the_dir_ex)
```

But instead I would like to input a dataset that looks like this:

|Test Assay | Var1 | Var2 |Freq|
|-----------|------|------|----|
|Assay1     |neg   |neg   |19  |
|Assay1     |neg   |pos   |5   |
|Assay1     |pos   |neg   |8   |
|Assay1     |pos   |pos   |141 |
|Assay2     |neg   |neg   |25  |
|Assay2     |neg   |pos   |6   |
|Assay2     |pos   |neg   |17  |
|Assay2     |pos   |pos   |33  |
|Assay3     |neg   |neg   |99  |
|Assay3     |neg   |pos   |20  |
|Assay3     |pos   |neg   |5   |
|Assay3     |pos   |pos   |105 |

I want to use the same function epi_analysis and export a csv for each
Test Assay (in this example Assay1, Assay2, and Assay3). So far I
have:

```
#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, digits = 3),
            round(rval$element$pfp$est, digits = 3),
            round(rval$element$pfn$est, digits = 3),
            round(kappa2$coeff.val, digits = 3),
            round(gwet$coeff.val, digits = 3),
            round(rkappa$pabak$est, digits = 3))
  cis <- c(paste(round(rval$elements$sensitivity$lower, digits = 3),
round(rval$elements$sensitivity$upper, digits = 3), sep = ","),
           paste(round(rval$elements$specificity$lower, digits = 3),
round(rval$elements$specificity$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfp$lower, digits = 3),
round(rval$element$pfp$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfn$lower, digits = 3),
round(rval$element$pfn$upper, digits = 3), sep = ","),
           kappa2$coeff.ci,
           gwet$coeff.ci,
           paste(round(rkappa$pabak$lower, digits = 3),
round(rkappa$pabak$lower, digits = 3), sep = ","))

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

  write.csv(df,
            file = paste0(the_dir, "/", basename(.x$TestAssay)),
            na = "999.99",
            row.names = FALSE)

}

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

But the only output I see is:
```
[[1]]
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, digits = 3),
            round(rval$element$pfp$est, digits = 3),
            round(rval$element$pfn$est, digits = 3),
            round(kappa2$coeff.val, digits = 3),
            round(gwet$coeff.val, digits = 3),
            round(rkappa$pabak$est, digits = 3))
  cis <- c(paste(round(rval$elements$sensitivity$lower, digits = 3),
round(rval$elements$sensitivity$upper, digits = 3), sep = ","),
           paste(round(rval$elements$specificity$lower, digits = 3),
round(rval$elements$specificity$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfp$lower, digits = 3),
round(rval$element$pfp$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfn$lower, digits = 3),
round(rval$element$pfn$upper, digits = 3), sep = ","),
           kappa2$coeff.ci,
           gwet$coeff.ci,
           paste(round(rkappa$pabak$lower, digits = 3),
round(rkappa$pabak$lower, digits = 3), sep = ","))

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

  write.csv(df,
            file = paste0(the_dir, "/", basename(.x$TestAssay)),
            na = "999.99",
            row.names = FALSE)

}

[[2]]
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, digits = 3),
            round(rval$element$pfp$est, digits = 3),
            round(rval$element$pfn$est, digits = 3),
            round(kappa2$coeff.val, digits = 3),
            round(gwet$coeff.val, digits = 3),
            round(rkappa$pabak$est, digits = 3))
  cis <- c(paste(round(rval$elements$sensitivity$lower, digits = 3),
round(rval$elements$sensitivity$upper, digits = 3), sep = ","),
           paste(round(rval$elements$specificity$lower, digits = 3),
round(rval$elements$specificity$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfp$lower, digits = 3),
round(rval$element$pfp$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfn$lower, digits = 3),
round(rval$element$pfn$upper, digits = 3), sep = ","),
           kappa2$coeff.ci,
           gwet$coeff.ci,
           paste(round(rkappa$pabak$lower, digits = 3),
round(rkappa$pabak$lower, digits = 3), sep = ","))

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

  write.csv(df,
            file = paste0(the_dir, "/", basename(.x$TestAssay)),
            na = "999.99",
            row.names = FALSE)

}

[[3]]
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, digits = 3),
            round(rval$element$pfp$est, digits = 3),
            round(rval$element$pfn$est, digits = 3),
            round(kappa2$coeff.val, digits = 3),
            round(gwet$coeff.val, digits = 3),
            round(rkappa$pabak$est, digits = 3))
  cis <- c(paste(round(rval$elements$sensitivity$lower, digits = 3),
round(rval$elements$sensitivity$upper, digits = 3), sep = ","),
           paste(round(rval$elements$specificity$lower, digits = 3),
round(rval$elements$specificity$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfp$lower, digits = 3),
round(rval$element$pfp$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfn$lower, digits = 3),
round(rval$element$pfn$upper, digits = 3), sep = ","),
           kappa2$coeff.ci,
           gwet$coeff.ci,
           paste(round(rkappa$pabak$lower, digits = 3),
round(rkappa$pabak$lower, digits = 3), sep = ","))

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

  write.csv(df,
            file = paste0(the_dir, "/", basename(.x$TestAssay)),
            na = "999.99",
            row.names = FALSE)

}

[[4]]
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, digits = 3),
            round(rval$element$pfp$est, digits = 3),
            round(rval$element$pfn$est, digits = 3),
            round(kappa2$coeff.val, digits = 3),
            round(gwet$coeff.val, digits = 3),
            round(rkappa$pabak$est, digits = 3))
  cis <- c(paste(round(rval$elements$sensitivity$lower, digits = 3),
round(rval$elements$sensitivity$upper, digits = 3), sep = ","),
           paste(round(rval$elements$specificity$lower, digits = 3),
round(rval$elements$specificity$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfp$lower, digits = 3),
round(rval$element$pfp$upper, digits = 3), sep = ","),
           paste(round(rval$element$pfn$lower, digits = 3),
round(rval$element$pfn$upper, digits = 3), sep = ","),
           kappa2$coeff.ci,
           gwet$coeff.ci,
           paste(round(rkappa$pabak$lower, digits = 3),
round(rkappa$pabak$lower, digits = 3), sep = ","))

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

  write.csv(df,
            file = paste0(the_dir, "/", basename(.x$TestAssay)),
            na = "999.99",
            row.names = FALSE)

}
```

and there are no csvs in my epidata folder. Any
suggestions/corrections welcomed. I haven't used group_map() before,
but I am keen to use it.



More information about the R-help mailing list