有没有一种(更好的)方法来提取文件名的数字部分以用作矩阵的标量乘数?

问题描述 投票:0回答:1

我有一组 csv 文件,其中包含相同大小的矩阵,其中第一行和第一列是轴标签(如果有人熟悉的话,它们是荧光激发发射矩阵),无法更改。这些文件均以相同的模式命名(例如 CaL_026-4x-1p0-20Jul23_EEM.csv 、 CaL_027-10x-1p0-20Jul23_EEM.csv ),并且名称包含 .我需要用来乘以单元格 B2:AZ293 的稀释因子。我是 R 初学者,老实说不知道从哪里开始。

我得到了这个部分损坏的 starRdom 脚本,该脚本应该读取这些文件,通过消除噪声和散射来处理它们,然后输出一个更正的文件以用于进一步的数据处理。损坏的部分之一是解释稀释因子的部分,这意味着我的输出文件有时充满了比应有值小 20 倍的值。理想情况下,我希望解决方案是 R 读取文件名,该文件名始终与上面的模式相同,可以提取破折号和 x 之间的数字(我已经修复了这部分,但它很笨重),并且然后使用该数字乘以列表中相应矩阵的单元格 B2:AZ293(例如,上例中 Cal_026 中的单元格 B2:AZ293 应乘以 4,但 Cal_027 中的单元格 B2:AZ293 应乘以 10)。

这是我尝试过的,它真的很笨重,因为我不知道我在做什么!我是一名新研究生,我在本科时学到的编程是针对仪器而不是数据处理:(

我尝试了几种数字提取方法,它对每个数量级使用一次提取效果最好(如果需要,可以轻松添加行以包含更高的数量级)和处理背景扫描的行(技术上是 1x稀释,这就是我所做的),然后从字符串转换为数字:

#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(x, pattern = ".*-(.)x.*", replacement = "\\1")
dilution<-str_replace(x, 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
  }
}

它会吐出错误“i[2:293, 2:51] 中的错误:维数不正确”,我想这意味着我不能只做其中的一部分?或者也许我误解了它应该如何工作。大家有什么想法吗?

r matrix-multiplication
1个回答
0
投票

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

创建

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]
没有任何意义。我认为你的意思是
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
© www.soinside.com 2019 - 2024. All rights reserved.