r - 建议化学家 : Automate/Streamline his Voltammetry Data Graphing Code

标签 r excel plot

我是最近处理大量伏安数据的化学家。让我说得很清楚,并提供一些研究信息。我在固态导电薄膜上运行从起始电压到终止电压的扫描。这些扫描保存为单个文件夹中的 .txt 文件(名称方案:run#.txt)。我正在研究电导如何随着温度的变化而变化。在给定温度下绘制电流与电压的 LINEST 线给了我一条斜率 = 电导的线。一旦我获得了每次扫描的电导(斜率),我绘制电导与温度的关系图以查看与温度相关的电导特性。我一直在 Excel 中执行此操作,但找到了使用 R 完成工作的更快方法。我对 R (Rstudio) 是全新的,并且认识到我的编码不是最好的。毫无疑问,可以简化和加快这一过程,这将大有帮助。这就是我目前执行该过程的方式:

# Set working directory with folder containing all .txt files for inspection

# Add all .txt files to the global environment

allruns<-list.files(pattern=".txt")

for(i in 1:length(allruns))assign(allruns[i],read.table(allruns[i]))

由于电压列(1x1000 矩阵)对于所有运行都是相同的,并且位于每个 .txt 文件的 V1 列中,因此我将 x 指定为第一个文件夹中的电压列
x<-run1.txt$V1

所有电流(这些电流随着电压的变化而变化)都可以在所有 .txt 文件的 V2 列中找到,因此我将 y# 分配给每个。这些是一次输入一个..
y1<-run1.txt$V2
y2<-run2.txt$V2
y3<-run3.txt$V2
# ...
yn<-runn.txt$V2

这样我就可以获得每个 LINEST 的 eqn(每次扫描一个 LINEST 并稍后用 abline 绘制)。再次一次输入一个:
run1<-lm(y1~x)
run2<-lm(y2~x)
run3<-lm(y3~x)
# ...
runn<-lm(yn~x)

为了在同一个图上获得一个包含所有 LINEST (每个 scan 一个)的单个图,而不显示数据点,我一直在使用这种编码模式首先在单独的系列中获取单个图上的所有数据点:
plot(x,y1,col="transparent",main="LSV Solid Film", xlab = "potential(V)",ylab="current(A)", xlim=rev(range(x)),ylim=range(c(y3,yn)))

par(new=TRUE)
plot(x,y2,col="transparent",main="LSV Solid Film", xlab = "potential(V)",ylab="current(A)", xlim=rev(range(x)),ylim=range(c(y3,yn)))

par(new=TRUE)
plot(x,y3,col="transparent",main="LSV Solid Film", xlab = "potential(V)",ylab="current(A)", xlim=rev(range(x)),ylim=range(c(y1,yn)))

# ...

par(new=TRUE)
plot(x,yn,col="transparent",main="LSV Solid Film", xlab = "potential(V)",ylab="current(A)", xlim=rev(range(x)),ylim=range(c(y1,yn)))

#To obtain all LINEST lines (one for each scan, on the single graph):
abline(run1,col=””, lwd=1)
abline(run2,col=””,lwd=1)
abline(run3,col=””,lwd=1)
# ...
abline(runn,col=””,lwd=1)

# Then to get each LINEST equation:
summary(run1)
summary(run2)
summary(run3)
# ...
summary(runn)

每次使用summary() ,我复制斜率并将其粘贴到 Excel 表中 - 以及我单​​独记录的相应扫描温度。然后,我将薄膜的电导 v 温度点绘制为 X-Y 散射线,以平滑线给出温度相关的电导曲线。给我一个 R 中的单线图和 Excel 中的电导 v temp。

这种技术实际上比在 Excel 中完成所有操作要快得多,但它可以更快更有效地完成!!!此外,如果我需要更改某些内容,则需要重新执行整个过程,并进行任何必要的更改。这个过程在 Excel 中可能需要 5 个小时,在 R 中需要 1.5 个小时(也许我太慢了)。尽管如此,非常感谢任何有助于进一步自动化/简化此操作的提示。

最佳答案

list 中有很多关于数据操作的问题小号;存储 matrix 的列表或 data.frame 的列表速度很快,在一个上干净地运行的代码可以应用于剩余的 n-1非常简单地。

(注意:我在这里展示它的方式是一种技术:将所有内容保存在划分良好的列表中。其他人会建议 - 非常有道理 - 将事物组合成一个 data.frame 并添加一个 group 变量(到确定数据来自哪个文件/实验)将有助于更高级的多实验回归或组合绘图,例如 ggplot2。我不打算在这里讨论后一种技术,还没有。)

  • 长期谴责不做for(...) assign(..., read.csv(...)) ;你已经完成了重要的部分,所以这相对容易:
    allruns <- sapply(list.files(pattern = "*.txt"), read.table, simplify = FALSE)
    

    ( sapply(..., simplify=FALSE) 的使用类似于 lapply(...) ,但它有一个很好的副作用,即用每个文件名命名单个 list 元素。在这种情况下,它可能不是关键但相当在其他地方方便。)
  • 提取不变和可变数据非常简单:
    allLMs <- lapply(allruns, function(mdl) lm(V2 ~ V1, data = mdl))
    

    我正在使用每个表的 V1这里而不是一次提取的x ...尽管您可能想知道为什么,但我认为保留它的原因有两个:(1) 以防万一 V1变量甚至是一排不同的,这将节省您; (2) 这样构建模型非常容易。

    此时,allLMs 内的每个对象是 lm对象,这意味着我们可以这样做:
    summary(allLMs[[1]])
    
  • 绘图:我想我明白你为什么使用 par=NEW ,我不得不笑……在我开始使用这种技术之前,我已经对 R 有一段时间了。我认为您需要的实际上要简单得多:
    xlim <- rev(range(allruns[[1]]$V1))
    ylim <- range(sapply(allruns, `[`, "V2"))
    # this next plot just sets the box and axes, no points
    plot(NA, type = "na", xlim = xlim, ylim = ylim)
    
    # no need to plot points with "transparent" ...
    ign <- sapply(allLMs, abline, col = "") # and other abline options ...
    
  • 再次使用列表将所有模型复制到 Excel 中:
    out <- do.call(rbind, sapply(allLMs, function(m) summary(m)$coefficients[,1]))
    

    现在这将是一个单独的 data.frame,所有系数都在两列中。 (随意使用类似的技术来提取其他模型摘要属性,包括 std errt.valuePr(>|t|) (在 $coefficients 中);或 $r.squared$adj.r.squared 等)
    write.csv(out, file="clipboard", sep="\t")
    

    并粘贴到 Excel 中。 (或者,更好的是,将其保存为 CSV 文件并导入,因为您可能希望保留它。)

  • 为此使用列表的技巧之一是坚持:尽可能长时间地将事物保存在列表中,这样您就不必单独处理模型。一个口头禅是,如果你这样做一次,你不应该再次输入它,只需循环/应用/映射/随便什么。在你必须之前不要从列表中提取太多。

    关于r - 建议化学家 : Automate/Streamline his Voltammetry Data Graphing Code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45250315/

    相关文章:

    r - ggplot geom_tile 间距与刻面

    r - 在 Shiny Leaflet 中为空间子集绘制刷亮或访问绘制的形状几何图形

    Python:如何将所有记录写入/打印到文件中

    excel - 是否可以将 InStr() 与 Application.Vlookup() 结合使用?

    python - 使用 matplotlib.pyplot 在 python 中绘图的线条样式功能

    python - 调整大小以适应文本的 Matplotlib 轴

    r - Amazon Web Services - 如何每天运行一个脚本

    java - 如何让 rJava 在 osx 上使用更新版本的 java?

    Excel VBE 导出不一致

    python - 是否可以用每组中的观察次数来注释 seaborn fiddle 图?