R批量读取Li-6800数据

植物学研究中,试验测定时间跨度通常比较大,数据文件通常众多,而分析的时候一个个文件读取不仅耗时,还容易出错。批量读取之后合并到一个文档是比较理想的方式。今天尝试解决了光合仪数据批量读取、清洗、整合。光合仪型号:Li-6800。

Li-6800提供两种数据格式,个人一贯喜欢文本文件,Excel格式极少打开和使用。因此只针对文本文件,事实上,Excel也有很多方式可以读取,难度与文本文件相比没有显著差异。

第一步,获得文件夹中数据文件的列表


# Pathway ----------------------------------------------
VPDdata_path <- "./01-Data/VPD_responses"  

# File list -------------------------------------------

files <- list.files(path = VPDdata_path)  

files

结果如下:

[1] “2018-08-21_A_RR_flc_3” “2018-08-21_A_RR_flc_4” “2018-08-21_B_RR_WT_1” “2018-08-21_B_RR_WT_2”
[5] “2018-08-22_A_AC_not_4” “2018-08-22_A_AC_WT_3” “2018-08-22_B_AC_flc_3” “2018-08-22_B_RR_sit_3”
[9] “2018-08-23-A_RR_WT_3” “2018-08-23_B_RR_flc_3” “2019-03-19_A_RR_WT_1” “2019-03-19_A_RR_WT_2”
[13] “2019-03-19_B_RR_WT_3” “2019-03-19_B_RR_WT_4” “2019-03-20_A_AC_not_1” “2019-03-20_A_AC_not_2”
[17] “2019-03-20_B_AC_not_1” “2019-03-20_B_AC_not_2” “2019-03-21_A_AC_not_3” “2019-03-21_B_AC_not_3”
[21] “2019-03-22_A_RR_flc_1” “2019-03-22_A_RR_flc_2” “2019-03-22_B_RR_flc_1” “2019-03-22_B_RR_flc_2”
[25] “2019-03-24_A_RR_sit_1” “2019-03-24_A_RR_sit_2” “2019-03-24_B_RR_sit_1” “2019-03-24_B_RR_sit_2”
[29] “2019-03-25_A_AC_WT_1” “2019-03-25_A_AC_WT_2” “2019-03-25_B_AC_WT_1” “2019-03-25_B_AC_WT_2”
[33] “2019-03-26_A_AC_flc_1” “2019-03-26_A_AC_flc_2” “2019-03-26_B_AC_flc_1” “2019-03-26_B_AC_flc_2”

第二步,创建包含文件名的数据表

# Rreate a data frame to hold the file names ------------------
VPD_resp  <- data_frame(filename = files) 
                                         

第三步,创建读取Li6800数据的函数。


read_li6800 <- function(datafile){
  skipline <- 53
  colname <- read.delim(datafile, sep = "\t", skip = skipline,
                        header = TRUE, fill = TRUE)

  Licordata <- read.delim(datafile, sep = "\t", skip = skipline+2,
                     header = FALSE, fill = TRUE)

  colnames(Licordata) <- colnames(colname)

  return(Licordata)
}

第四步,利用创建的函数批量读取。

基本思路是利用purrr包的map()函数,以list形式读取数据文件。然后用dplyr包的mutate()函数把之前创建的数据名称为元素的数据表和读取的list合并成为一个镶嵌的数据表。

library(purrr)
library(dplyr)
mutate(data = VPD_resp, file_contents = map(filename, 
          ~ read_li6800(file.path(VPDdata_path,.))) ) 

第五步,用purrr的unnest()函数把list释放出来。


VPD_resp_data <- unnest(VPD_resp)

完成。

当然,很多方法可以做同样的事情(比如使用基础函数里的rbind() 和rm()函数),选择自己认为最合适的就好了。


Wickson Hall, UC Davis, CA