我有一组.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

enter image description here

我试着这么做

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 .谢谢你,菲尔!

推荐答案

这是一个部分的答案,因为我不相信它能解决你的问题.您所拥有的代码在几个方面存在问题.

创建dilution对象的部分引用了x对象,但是x没有在任何地方定义,所以不可能判断它是否可以工作(我认为这是因为定义它的代码在您的问题中没有共享).我假设它是这样的,并且dilution号天体和eemlist号天体的长度相同.

for循环没有意义--您不会将其赋给对象.相反,您可以对对象的第i个元素进行赋值,如下所示

for (i in 1:length(myobj)) {
  myobj[i] <- some_function(i)
}

此外,您会得到这个错误,因为i代表一个从1到对象长度迭代的数值.因此,i[2:293,2:51]没有意义-标量值1没有这样的范围.我想你的意思是eemlist[[i]][2:293,2:51],如果eemlist是一个矩数组表的话.

下面这段代码举例说明了我认为您要实现的目标.第一位只是为了使示例可重现,并不是为了在您的实际情况中使用(矩阵将仅由1组成,以便于查看输出):

mymx_list <- list()

for (i in 1:5) {
  mymx_list[[i]] <- matrix(1, nrow = 392, ncol = 51)
}

dilution <- 5:9

下面将相应地将稀释向量的每个元素与mymx_list中的每个矩阵相乘.

for (i in seq_along(mymx_list)) {
  mymx_list[[i]][2:392, 2:51] <- mymx_list[[i]][2:392, 2:51] * dilution[i]
}

# To see the result
mymx_list

我在这里使用seq_along(x),因为它比1:length(x)更安全.

R相关问答推荐

单击 map 后,将坐标复制到剪贴板

从嵌套列表中智能提取线性模型系数

咕噜中的元素列表:map

terra nearest()仅为所有`to_id`列返回NA

如何按排序顺序打印一个框架中所有精确的唯一值?

找出二叉树中每个 node 在R中的深度?

线性模型斜率在减少原始数据时提供NA

合并后返回列表的数据帧列表

R-按最接近午夜的时间进行筛选

过滤名称以特定字符串开头的文件

我如何go 掉盒子图底部的数字?

将摘要图添加到facet_WRAP gglot的末尾

我如何使用循环来编写冗余的Rmarkdown脚本?

R代码,用于在线条图下显示观测表

有没有办法将不等长的列表转换为R中的数据帧

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

使用R、拼图和可能的网格包绘制两个地块的公共垂直线

如何用不同长度的向量填充列表?

我有2011-2022年的年度数据.如何计算最低年份和最高年份之间的差额?

我怎么才能把一盘棋变成一盘棋呢?