在R中创建一个串行处理多个csv文件的管道

时间:2018-04-03 08:08:26

标签: r csv pipeline

我的管道将csv读入数据帧,分配rownames,删除列,执行pca,绘制pca并从pca中提取有意义的变量,这些变量也是绘制的。 这是我当前的代码,它只能到第一个图:

library(ggplot2)
library(ggrepel)

tsv = read.csv('matrix.tsv', sep='\t')
bell= read.csv('bell.tsv', sep='\t')
tail= read.csv('tail.tsv', sep='\t')

dfList = list(tail, tsv, bell)
#process csv's
dfList = lapply(dfList, function(dum){
  rownames(dum) = dum[,1]
  dum[,1] = NULL
  dum$X = NULL
  dum = dum[, -grep('un', colnames(dum))]
})
#create pca's of dataframes
pcaList = lapply(dfList, function(pca){
  prin_comp = prcomp(pca, scale. = T)
})
#plot top 2 principle components in the pca
plotList = lapply(pcaList, function(prin_comp){
  t = qplot(x=prin_comp$rotation[,1], y=prin_comp$rotation[,2]) + geom_text_repel(aes(label=row.names(prin_comp$rotation)))
})
#this plots the 3 plots, one for each pca, but they are un-named
plotList

问题是图表没有有意义的名称/标题。我不知道如何保持信息存在,从功能传递到功能。 我知道必须有一种更优雅的方式来做到这一点。我花了一天的时间阅读有关处理多个csv文件的类似且不太相似的问题。但要么它们不适用,要么不适合我的情况。 正如这个问题的标题所暗示的那样,我宁愿一次在一个csv上执行此操作,而不是一次只执行3个csv,因为所讨论的csv非常大,每个超过5GB,因此将每个数据帧和pca保留在内存中同时是不可能的。

1 个答案:

答案 0 :(得分:1)

你只需要保留一个你想用作标题的字符串并将ggtitle(YOUR_TITLE)添加到你的情节中,但这对于你当前的代码来说并不容易。在进行下一步之前,不是为每个CSV执行每个分析步骤,为什么不一次只为一个CSV执行所有步骤?

您的代码可能如下所示:

library(ggplot2)
library(ggrepel)

csvs <- c("matrix.tsv","bell.tsv","tail.tsv")
for (i in csvs) {
  # read file
  df <- read.csv(i, sep='\t')
  # process file
  rownames(df) <- df[,1]
  df[,1] <- NULL
  df$X = NULL
  df = df[, -grep('un', colnames(df))]
  # create pca
  pca <- prcomp(df, scale = T)
  # plot pca
  pcaPlot <- qplot(x=pca$rotation[,1], y=pca$rotation[,2]) +
             geom_text_repel(aes(label=row.names(pca$rotation))) +
             ggtitle(i)
  print(pcaPlot)
  # extract and plot meaningful variables
  # ...
}

基本上我只是将你所做的一切都放在lapply循环的for调用中,这种方法当时也处理了一个CSV。