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