【问题标题】:Export results from split and lapply to a csv or Excel file将结果从 split 和 lapply 导出到 csv 或 Excel 文件
【发布时间】:2019-06-05 20:13:28
【问题描述】:

我正在使用 split()lapply 函数批量运行 Mann Kendall 趋势测试。在下面的代码中,split() 按分析物(水质参数)分隔结果 (ConcLow)。然后 lapply 为每个运行 MannKendallsummary。输出到控制台(代码如下所示的示例),但我希望它进入 Excel 或 cvs 文档,以便我可以使用它。理想情况下,Excel 文档将在第一列中包含分析物(例如 TOC),然后结束列 = tau 值,第三列 = pvalue。然后下一个选项卡或以下列将显示来自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

【问题讨论】:

  • 您更喜欢以summary() 输出格式导出数据,还是将数据放在一个表中,每个值对应一个列,每个列表元素对应一个行?
  • @Mako212 - 感谢您的回复!最好有一张桌子
  • 能给个样本数据集吗?
  • @DJV - 我尝试将我的数据的一个小表复制到其中,但它无法正常工作。只显示一串数字和文本。如何在我的问题中输入数据表?
  • 你可以使用dput(data.frame/list here)

标签: r split lapply


【解决方案1】:

我个人认为,我会使用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"))

}

【讨论】:

  • 今天早上我正在尝试您的第二个代码,但“write_excel_csv”出现错误,提示找不到该函数。我也找不到它的包裹。这是你在别处创建的函数吗?
  • 我的错。请看我的编辑。它加载了tidyverse,但它是readr 包的一部分。
  • 加载 readr 包使您的示例工作。谢谢你。但是您的示例运行的是 Wilcox 测试,而我运行的是 MannKendall 测试。是否可以使用运行 Mann Kendall 的 lapply 方法将您的 write_excel_cvs 函数转换为我的数据(参见相关示例)?感谢您的帮助
  • 我找不到你的函数,所以我使用了基础 R。在他对 '?wilcox.test' 的帮助中,你可以看到它实际上也支持 mann。无论如何,您可以用您选择的功能替换它:)
  • 对不起,我可能遗漏了一些东西,但我似乎无法让它做我需要的事情。我正在使用与 mtcars 数据集不同的数据集,因为我有大约 20 个分析物和大约 15 个站点(因此我需要首先使用 split 函数为每个站点创建分析物列表和相关结果)。在您的代码示例中,我将在哪里使用我的列表“mk.BarkTop”与数据框“BarkTop”?
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2016-08-06
  • 2018-03-22
相关资源
最近更新 更多