我有一组.csv文件,它们包含大小相同的矩阵,其中第一行和第一列是轴标签(如果有人熟悉的话,它们是荧光激发emits 矩阵),不能更改.这些文件都使用相同的模式命名(例如,Cal_026-4x-1p0-20Jul23_EEM.csv,Cal_027-10x-1p0-20Jul23_EEM.csv),名称包含我需要用来乘以单元格B2:AZ293的稀释系数.
我得到了一个部分损坏的staRdom脚本,该脚本应该读入.dat文件,通过消除噪音和散射来处理它们,然后输出一个更正的.csv文件以用于进一步的数据处理.其中一个损坏的部分是占稀释因子的部分,这意味着我的输出文件有时充满了比它们应该小20倍的值.理想情况下,我希望这个问题的解决方案是R读取文件名,该文件名始终与上面的模式相同,可以拉出破折号和x之间的数字(我已经修复了这一部分,但它很笨重),然后使用该数字乘以列表中相应矩阵的单元格B2:AZ293(例如,来自上述示例的Cal_026的单元格B2:AZ293应乘以4,但来自Cal_027的单元格B2:AZ293应乘以10).
我try 了几种方法来提取数字,并决定对每个数量级使用一个提取(如果需要,很容易添加行以包括更高的数量级)和一行来处理背景扫描(从技术上讲,这是1倍的稀释,所以我就是这么做的),然后从字符串转换为数字:
#Read in EEM data! move folder name to working EEM folder
folder <- "path/subfolder" #accesses the EEM folder where data for specific instrument run is stored
eem_list <- eem_read("path/subfolder", recursive = FALSE, import_function = "aqualog") #reads EEMs in
#account for dilution factor corrections here!
dilution <- list.files("path/subfolder")
dilution<-str_replace(dilution, pattern = ".*-(.)x.*", replacement = "\\1")
dilution<-str_replace(dilution, pattern = ".*-(..)x.*", replacement = "\\1")
dilution<-str_replace(dilution, pattern = "MQblank.*", replacement = "1")
dilution <-as.numeric(dilution)
eem_overview_plot(eem_list, spp=9, contour = TRUE) #plots EEM data
现在,理论上,eem_list应该可以与稀释向量相乘,但我不知道如何做到这一点,或者如何将其限制在细胞的子集上?我需要向量中的第一个条目来乘以第一个矩阵的单元格B2:AZ293(如果它是在Excel中打开的). . 我的意思是:模拟矩阵之前和之后的矩阵部分乘以稀释系数.A1:A293和A1:AZ1保持不变,但B2:AZ293已乘以4
我试着这么做
dilution <-as.numeric(dilution)
#multiply file by dilution factor
eemlist <- for(i in 1:length(eem_list)){
for(j in 1:length(dilution)){
eem_list <-i[2:293,2:51]*j
}
}
哪一项会显示错误"Error in I[2:293,2:51]:Not Number of Dimension",我猜这意味着我不能只做其中的一部分?或许我误解了这应该是怎么回事.有谁有什么主意吗?
EDIT1: 在我写这个问题的时候,我找到了稀释因子提取问题的解决方案,所以我为令人困惑的代码道歉,并感谢您对我的耐心.我已经try 了Phil的解决方案(谢谢你的例子!我很难在这个零件的例子中找到类似的问题),但我仍然遇到了不正确的维度数错误.以下是我目前所处的位置:
folder <- "path/subfolder" #accesses the folder where example data is stored
eem_list <- eem_read("path/subfolder", recursive = FALSE, import_function = "aqualog") #reads EEMs in
#extract dilution factor from file name
dilution <- list.files("path/subfolder")
dilution<-str_replace(dilution, pattern = ".*-(..)x.*", replacement = "\\1")
dilution<-str_replace(dilution, pattern = ".*-(.)x.*", replacement = "\\1")
dilution<-str_replace(dilution, pattern = "MQblank.*", replacement = "1")
dilution <-as.numeric(dilution)
#multiply EEM by dilution factor
for (i in seq_along(eem_list)) {
eem_list[[i]][2:293, 2:52] <- eem_list[[i]][2:293, 2:52] * dilution[i]
}
eem_overview_plot(eem_list, spp=9, contour = TRUE)
新的错误显示为"Error in eem_list[[i]][2:293,2:52]:数目不正确的尺寸".我重新计算了原始文件的尺寸,它实际上是293行乘52列,所以这不是问题所在.
EDIT2:克里斯的理智判断给出了零维度,我认为这确实解释了为什么矩阵乘法不起作用.我做了更深入的研究,发现输入文件是以制表符分隔的.dat文件(OOP),但每个"列"都是同一单元格的一部分,并且在第一个轴标签行和实际数据的第一行(即第4行)之间有两个元数据行.我try 了两次更改,但都没有奏效.首先,我try 使用Phil的建议来匹配实际范围,但它仍然给出了零维度.然后,我使用Excel中的文本到列转换按钮更改了其中一个.dat文件,看看这是否会根据Chris的建议赋予它任何维度,但它没有.
我认为这意味着我必须将此稀释校正重新定位到生成导出.csv文件之后.唯一的问题是,在生成一些峰值拾取文件之后,文件被导出.我不知道重新定位导出函数是否会 destruct 峰值拾取函数,但我打算try 一下.我认为最好的办法是导出未校正的.csv文件,将其读回,按先前计划进行稀释校正,然后使用第二个导出函数重新导出它们以覆盖第一个导出文件.
新代码:
#RELOCATED EEM EXPORT FUNCTION.
setwd("C:/Users/peter/Downloads/JohnstonLab/Projects/CampusLakes/Duetta/ProcessedCaL/026-034TEST") #sets the folder you plan to export into
eem_export=function(eem){
#extract data in the right format
df=eem$x[,ncol(eem$x):1]
colnames(df)=as.character(eem$ex)
rownames(df)=as.character(eem$em)
write.csv(df, file = paste(eem$sample,".csv",sep=""), quote = FALSE)
}
lapply(1:length(eem_list), function(i) eem_export(eem_list[[i]]) )
#Read in processed EEM data
folder <- "exportpath/subfolder"#accesses the folder where export data is stored
eem_list <- eem_read("exportpath/subfolder", recursive = TRUE, import_function = "aqualog") #reads EEMs in
eem_overview_plot(eem_list, spp=9, contour = TRUE)
lapply(eem_list, dim)
#extract dilution factor from file name
dilution <- list.files("exportpath/subfolder")
dilution<-str_replace(dilution, pattern = ".*-(..)x.*", replacement = "\\1")
dilution<-str_replace(dilution, pattern = ".*-(.)x.*", replacement = "\\1")
#dilution<-str_replace(dilution, pattern = "MQblank.*", replacement = "1") #relocation means blank doesn't need to be accounted for
dilution <-as.numeric(dilution)
#multiply EEM by dilution factor
for (i in seq_along(eem_list)) {
eem_list[[i]][2:293, 2:52] <- eem_list[[i]][2:293, 2:52] * dilution[i]
}
#EXPORT AGAIN!!!! This time DF is accounted for
setwd("exportfolder/subfolder") #sets the folder you plan to export into
eem_export=function(eem){
#extract data in the right format
df=eem$x[,ncol(eem$x):1]
colnames(df)=as.character(eem$ex)
rownames(df)=as.character(eem$em)
write.csv(df, file = paste(eem$sample,".csv",sep=""), quote = FALSE)
}
lapply(1:length(eem_list), function(i) eem_export(eem_list[[i]]) )
新的代码一直运行到矩阵代数,所以我还没有测试峰值 Select 函数是否被 destruct .也就是说,运行lapply(eem_list, dim)
再次产生零维,因此矩阵代数仍然不起作用并不令人惊讶.我已经打开了.csv导出文件,它们看起来应该是正确的,所以我又一次被卡住了.错误仍然是"ERROR in eem_list[[i]][2:293,2:52]:错误的维数".第一个单元格(A1)为空可能是个问题吗?
EDIT3:
打印str(eem_list)
张照片:
str(eem_list)
List of 9
$ :List of 6
..$ file : chr "C:/Users/peter/Downloads/JohnstonLab/Projects/CampusLakes/Duetta/ProcessedCaL/026-034TEST/CaL_026-4x-1p0-20Jul23_EEM.csv"
..$ sample : chr "CaL_026-4x-1p0-20Jul23_EEM"
..$ x : num [1:292, 1:51] 0.0878 0.083 0.0781 0.0733 0.0686 ...
..$ ex : num [1:51] 250 255 260 265 270 275 280 285 290 295 ...
..$ em : num [1:292] 248 250 252 254 256 ...
..$ location: chr "C:/Users/peter/Downloads/JohnstonLab/Projects/CampusLakes/Duetta/ProcessedCaL/026-034TEST"
..- attr(*, "class")= chr "eem"
..- attr(*, "is_blank_corrected")= logi FALSE
..- attr(*, "is_scatter_corrected")= logi FALSE
..- attr(*, "is_ife_corrected")= logi FALSE
..- attr(*, "is_raman_normalized")= logi FALSE
$ :List of 6
..$ file : chr "C:/Users/peter/Downloads/JohnstonLab/Projects/CampusLakes/Duetta/ProcessedCaL/026-034TEST/CaL_027-10x-1p0-20Jul23_EEM.csv"
..$ sample : chr "CaL_027-10x-1p0-20Jul23_EEM"
..$ x : num [1:292, 1:51] 0.155 0.142 0.13 0.118 0.106 ...
..$ ex : num [1:51] 250 255 260 265 270 275 280 285 290 295 ...
..$ em : num [1:292] 248 250 252 254 256 ...
..$ location: chr "C:/Users/peter/Downloads/JohnstonLab/Projects/CampusLakes/Duetta/ProcessedCaL/026-034TEST"
..- attr(*, "class")= chr "eem"
..- attr(*, "is_blank_corrected")= logi FALSE
..- attr(*, "is_scatter_corrected")= logi FALSE
..- attr(*, "is_ife_corrected")= logi FALSE
..- attr(*, "is_raman_normalized")= logi FALSE
看起来,当我读回它们时,它将它们分解成导出函数用来构建它们的组件片段(这似乎是STARDOM eem_read
函数的内置功能).
我试着用稀释因子修正的变量是x,而我试着不考虑的变量是ex和em.当我在EXCEL中打开文件时,它们打开时单元格A1为空白,A2:A293填充了em的值,B1:AZ1填充了ex的值,B2:AZ293填充了x.我假设这意味着我需要弄清楚如何让R将eem_list中的每个x相乘,而不是eem_list?
EDIT4: 我试着把矩阵的维度换成"x"
for (i in seq_along(eem_list)) {
eem_list[[i]][['x']] <- eem_list[[i]][['x']] * dilution[i]
}
现在它成功了!!选峰功能也没有被 destruct .谢谢你,菲尔!