Экспорт результатов из split и lapply в файл CSV или Excel - PullRequest
0 голосов
/ 05 июня 2019

Я использую функции split() и lapply для массового запуска трендовых тестов Манна Кендалла.В приведенном ниже коде split() разделяет результаты (ConcLow) на Analyte (параметр качества воды).Затем lapply запускает MannKendall и summary для каждого.Вывод идет в консоль (пример показан ниже кода), но я бы хотел, чтобы он вошел в документ Excel или cvs, чтобы я мог работать с ним.В идеале документ Excel должен иметь аналит (например, оглавление) в первом столбце, затем конечный столбец = значение тау, 3-й столбец = значение.Тогда на следующей вкладке или в следующих столбцах будут отображаться результаты функции summary.Любая помощь, которую вы можете оказать, очень ценится!Я совершенно новичок в R.

mk.analyte <- split(BarkTop$ConcLow, BarkTop$Analyte) lapply(mk.analyte, MannKendall) lapply(mk.analyte, summary)

Вывод для каждого аналита выглядит следующим образом (здесь сокращенно, но это длинный список):

$TOC
tau = 0.0108, 2-sided pvalue =0.8081

$TOC
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.378   2.054   2.255   2.434   2.600   4.530 

Данные выглядят так:

Date        Location         Analyte   ConcLow   Units
  5/8/2000  Barker Res.   Hardness    3.34  mg/L (as CaCO3)
11/24/2000  Barker Res.   Hardness    9.47  mg/L (as CaCO3)
 6/12/2001  Barker Res.   Hardness     1.4  mg/L (as CaCO3)
12/29/2001  Barker Res.   Hardness    21.9  mg/L (as CaCO3)
 7/17/2002  Barker Res.   Fe (diss      81  ug/L
  2/2/2003  Barker Res.   Fe (diss      90  ug/L
 8/21/2003  Barker Res.   Fe (diss    0.08  ug/L
  3/8/2004  Barker Res.   Fe (diss  15.748  ug/L
 9/24/2004  Barker Res.   TSS          6.2  mg/L
 4/12/2005  Barker Res.   TSS            8  mg/L
10/29/2005  Barker Res.   TSS           10  mg/L

1 Ответ

0 голосов
/ 06 июня 2019

По моему мнению, я бы использовал tidyverse, так как его легче читать.

Короткий путь:

#Sample data
set.seed(42)
df <- data.frame(
  Location = replicate(1000, sample(letters[1:15], 1)), 
  Analyte = replicate(1000, sample(c("Hardness", "TSS", "Fe"), 1)), 
  ConcLow = runif(1000, 1, 30))

#Soltion
df %>% 
  nest(-Location, -Analyte) %>% 
  mutate(
    mannKendall = purrr::map(data, function(x) { 
      broom::tidy(Kendall::MannKendall(x$ConcLow))}), 
    sumData = purrr::map(data, function(x) { 
      broom::tidy(summary(x$ConcLow))})) %>% 
  select(-data)  %>% 
  unnest(mannKendall, sumData) %>% 
  write_excel_csv(path = "mydata.xls")

#How the table looks like: 
# A tibble: 45 x 13
   Location Analyte statistic p.value kendall_score denominator var_kendall_sco~ minimum    q1 median
   <fct>    <fct>       <dbl>   <dbl>         <dbl>       <dbl>            <dbl>   <dbl> <dbl>  <dbl>
 1 n        Fe        0.264    0.0907            61        231.            1258.    1.38 14.4    20.6
 2 o        Hardne~   0.0870   0.568             24        276.            1625.    2.02  9.52   18.3
 3 e        Fe       -0.108    0.499            -25        231.            1258.    1.14  9.24   15.9
 4 m        TSS      -0.00654  1                 -1        153              697     2.19  5.89   10.4
 5 j        TSS      -0.158    0.363            -27        171.             817     1.20  6.44   12.8
 6 h        Hardne~   0.0909   0.466             48        528             4165.    4.28 11.1    19.4
 7 l        TSS      -0.0526   0.780             -9        171.             817     5.39 12.5    21.1
 8 c        Fe       -0.0736   0.652            -17        231.            1258.    1.63  5.87   10.6
 9 j        Hardne~   0.415    0.0143            71        171.             817     4.50 11.7    15.4
10 k        Fe       -0.146    0.342            -37        253.            1434.    2.68 12.3    15.4
# ... with 35 more rows, and 3 more variables: mean <dbl>, q3 <dbl>, maximum <dbl>

Длинный путь

Это немного задом наперед, но вы можете сделать что-то ниже.Обратите внимание, что я использовал подмножество из набора данных mtcars для своего решения.

require(tidyverse)

df <- mtcars %>% 
  select(cyl, disp)

wilx <- df %>% 
  split(.$cyl) %>% 
  map(function(x) {broom::tidy(wilcox.test(x$disp, paired = FALSE,
                                           exact = FALSE))})


sumData <- df %>% 
  split(.$cyl) %>% 
  map(function(x) {summary(x$disp)})


for (i in 1:length(wilx)) { 

  write_excel_csv(as.data.frame(wilx[i]), path = paste0(getwd(), "/wilx", i, ".xls"))
  write_excel_csv(as.data.frame(unlist(sumData[i])), path = paste0(getwd(), "/sumData", i, ".xls"))

}
...