本次笔记内容:
- 导入多个文件并设置与文件名一致的变量名:assign(),strsplit()
- 单个pdf保存多张plot / 多个pdf保存多张plot
- $, [] , [[]] 备忘
你想以read.csv()
读入多个文件,并以文件名命名产生的各object
path <- 'home/usr/project/file'
files <- list.files(path = paht, pattern = "*report.csv") # 读取path文件夹中所有以report.csv结尾的文件
files
[1] "c_level_report.csv" "f_level_report.csv" "g_level_report.csv" "k_level_report.csv" "o_level_report.csv"
[6] "p_level_report.csv" "s_level_report.csv"
for (file in files) {
filename = strsplit(file, "[.]")[[1]][1] # 以.为分隔符,将'f_level_report.csv'这样的字符串拆分并取前一个。如果不在.外面加上[], R似乎会把.当作正则表达式从而出问题。
assign(filename,
read.csv(paste(path, file, sep = ""), header = TRUE, check.names = FALSE, row.names = 1))
# 使用assign()将filename和读入的文件对应起来
}
ls() # 查看一下相应的object
pdf() plot(...) dev.off()
用于保存图片,你根据上述不同物种的文件画了很多很多图,做了一个巨大List,其结构如下,一共3个levels, 1个level有4张图。
现在你要给每个level建立一个pdf,每个pdf里是对应这个level的4张图,并把pdf命名为“这个Level的PCA”。
list_tax_ra <- list(genus_level = g_level_report, family_level = f_level_report, phlumn_level = p_level_report)
for (tax_ in names(list_tax_ra)) {
pdf(paste(tax_, "PCA.pdf", sep = "_"), width = 10, height = 7) # 可以设置图片的大小
print(plots[tax_]) # 这里一定要print()出来。或者直接plot()出来,否则pdf是空的
dev.off()
}
如果你想在单个pdf里添加多个图,那把pdf()放在for loop外面就好。上述代码是已构建好一个存储好plot的list, 建立多个pdf存储多个图。
$,[],[[]]备忘
$, [], [[]]都是R的subsetting operators,应用于各种不同的数据类型,vectorc()
, list, dataframe等。在对不同数据类型的对象操作时,其含义是不一样的。
在第一个代码块中strsplit(file,"[.]")[[1]][1]
用到了[[]]和[]。当你对一个list of lists使用[], 得到的总是list. 要得到list中的内容,需要用[[]]。所以在这个代码中[[1]]把split的结果提取出来,其内容为一个vector。[1]则对vector操作,取该vector的第一个元素。
> strsplit("p_level_report.csv", "[.]")
[[1]]
[1] "p_level_report" "csv"
> strsplit("p_level_report.csv", "[.]")[1]
[[1]]
[1] "p_level_report" "csv"
> strsplit("p_level_report.csv", "[.]")[[1]]
[1] "p_level_report" "csv"
> strsplit("p_level_report.csv", "[.]")[[1]][1]
[1] "p_level_report"
在第二个代码块中,plots本身是个复杂List,plots[tax_]
返回的仍然是list:以name作为索引,提取出子list。
$可以用于对list的操作list$name
,或者dataframe提取列dataframe$colname
,它和[[]]很相似,但有个很容易犯的错误:
在函数、循环中,你可能会把要subset的列名存储在一个变量里,subset不出任何东西。这时候需要用mtcar[[var]]
> var <- "cyl"
# Doesn't work - mtcars$var translated to mtcars[["var"]]
> mtcars$var
NULL
网友评论