问题描述
我有这个清单:
file_name <- list.files(path = "./GSE124395/",pattern = "\\.csv$",full.names = TRUE)
并且我想获取该列表中的每个文件名并为每个文件名运行以下代码,以便将此列表中的每个项目都放入自己的矩阵中
P301_3_matrix <- read.delim(file = './GSE124395//GSM3531672_P301_3_CRYOMIXED11.coutt.csv')
P301_3_matrix <- data.frame(P301_3_matrix[,-1],row.names=P301_3_matrix[,1])
P301_3_matrix <- as.matrix(P301_3_matrix)
P301_3_colname <- read.table(file = './GSE124395//GSE124395_celseq_barcodes.192.txt',header = FALSE,row.names = 1)
P301_3_colname <- data.frame(P301_3_colname[,col=P301_3_colname[,1])
P301_3_colname <- as.matrix(P301_3_colname)
dim(P301_3_colname)
colnames(P301_3_matrix) <- P301_3_colname[,1]
我想为每个“./GSE.csv”文件重复此代码,并使用 ./GSE 文件名中的信息更改 P301_3_matrix 名称。
到目前为止,这是我的尝试,但它返回错误:文件中的错误(文件,“rt”):无效的“描述”参数
matrix_list <- list() # Create empty list
matrix_list
for (i in 1:length(file_name)) {
for (i in file_name){
matrix <- read.delim(file = file_name[i])
matrix <- data.frame(matrix[,row.names=matrix[,1])
matrix <- as.matrix(matrix) #<- makes the excel file into a matrix
matrix_colname <- read.table(file = './GSE124395//GSE124395_celseq_barcodes.192.txt',row.names = 1)
matrix_colname <- data.frame(matrix_colname[,col=matrix_colname[,1])
matrix_colname <- as.matrix(matrix_colname)
dim(matrix_colname)
colnames(matrix) <- matrix_colname[,1]
matrix_list[[i]] <- matrix
}
}
希望这是有道理的,感谢您的阅读!
更新:我在下面的评论中给出了答案
解决方法
read_expression_csv = function(file){
table = read.delim(file)
table = data.frame(table[,-1],row.names = table[,1])
as.matrix(table)
}
read_barcodes = function(file){
barcodes = read.table(file,header=FALSE,row.names=1)
barcodes = data.frame(barcodes[,col=barcodes[,1])
as.matrix(barcodes)
}
get_expression_matrix(file,barcodes){
expr = read_expression_csv(file)
colnames(expr) = barcodes
expr
}
barcodes = read_barcodes("./GSE124395//GSE124395_celseq_barcodes.192.txt")[,1]
files <- list.files(path = "./GSE124395/",pattern = "\\.csv$",full.names = TRUE)
expressions = lapply(files,get_expression_matrix,barcodes=barcodes)
names(expressions) = files
由于 lapply
,无需预先分配结果列表。
我只是将您的代码放入几个函数中以隔离和命名其逻辑。不能保证没有 CSV 文件它会工作。我几乎可以肯定您对 read.delim
做了一些奇怪的事情,简单的 read.table
和适当的参数化应该可以很好地工作。毕竟,read.delim
只是 read.table
的包装器。
好的,所以我认为这是我问题的部分答案。这会生成每个文件名的矩阵列表。
mylist<-list.files(path = "./GSE124395/",full.names = TRUE)
LoopList <- list()
for (i in 1:length(mylist)){
matrix_input <- read.delim(file =mylist[i])
matrix_input <- data.frame(matrix_input[,row.names=matrix_input[,1])
matrix_input <- as.matrix(matrix_input)
colname_input <- read.delim(file =mylist[i])
colname_input <- read.table(file = './GSE124395//GSE124395_celseq_barcodes.192.txt',header = FALSE,row.names = 1)
colname_input <- data.frame(colname_input[,col=colname_input[,1])
colname_input <- as.matrix(colname_input)
colnames(matrix_input) <- colname_input[,1]
LoopList[[i]]<-matrix_input
}
LoopList[1:5]
希望这对其他人有所帮助!