将一系列计算应用于R中类似数据帧的最简单方法

将一系列计算应用于R中类似数据帧的最简单方法,r,R,下面是我希望如何处理数据集的示例。理解我的数据框架的结构可能有点不同,但我希望它有意义: 必须使用ADry、AEthanol、BDry……列中的原始数据计算A、B和C列的第一密度。。。。。。因为这些之前也被定义为向量,所以我使用向量代替数据帧列,因为它较短-ADry_1_0代替Sample_1_0$ADry_1_0 Sample_1_0$ADensi_1_0=(ADry_1_0/(ADry_1_0-AEthanol_1_0))*(peth-pair)+pair Sample_1_0$BDens

下面是我希望如何处理数据集的示例。理解我的数据框架的结构可能有点不同,但我希望它有意义:

必须使用ADry、AEthanol、BDry……列中的原始数据计算A、B和C列的第一密度。。。。。。因为这些之前也被定义为向量,所以我使用向量代替数据帧列,因为它较短-ADry_1_0代替Sample_1_0$ADry_1_0

Sample_1_0$ADensi_1_0=(ADry_1_0/(ADry_1_0-AEthanol_1_0))*(peth-pair)+pair 
Sample_1_0$BDensi_1_0=(BDry_1_0/(BDry_1_0-BEthanol_1_0))*(peth-pair)+pair
Sample_1_0$CDensi_1_0=(CDry_1_0/(CDry_1_0-CEthanol_1_0))*(peth-pair)+pair
这就产生了A,B和C的10个密度。有趣的是平均密度

Mean_1_0=apply(Sample_1_0[7:9],2,mean)
下一个标准偏差被发现。我们主要对原始数据列ADry和AEthanol的标准偏差感兴趣,因为随后会进行误差传播计算,以了解计算密度时偏差的总和

StdAfv_1_0=apply(Sample_1_0,2,sd)
B和C的错误传播相同

ASd_1_0=(sqrt((sd(Sample_1_0$ADry_1_0)/mean(Sample_1_0$ADry_1_0))^2+(sqrt((sd(Sample_1_0$ADry_1_0)^2+sd(Sample_1_0$AEthanol_1_0)^2))/(mean(Sample_1_0$ADry_1_0)-mean(Sample_1_0$AEthanol_1_0)))^2))*mean(Sample_1_0$ADensi_1_0)
最后,我们在一个可绘图的数据框中半手工收集了末端信息的平均密度和偏差。有些代码可能有点长,也许我们可以用更短的代码获得相同的结果,但请注意,我们是新手

现在来看看真正的问题

这是为A_1_0、B_1_0和C_1_0准备的。我们希望将同一系列命令应用于其他15个数据帧。维度是相同的,它们将被命名为A_1_1、A_1_2、A_2_0等等

是否可以使用某种循环函数或制作一个包含x和y占位符的可加载脚本,例如,我们可以在其中轻松插入一个_1_1

提前感谢你,我尽量把混乱的程度控制在最低限度,尽管这很难


如果不使用单个向量,而是将原始数据组合成数据帧或更好的data.tables,然后按照@Gregor的建议将所有运行的所有数据帧存储到列表中,则可以使用下面的此函数和Lappy函数

my_func <- function(dataset, peth, pair){
  require(data.table)
  names <- names(dataset)
  setDT(dataset)[, `:=` (ADens = (get(names[1])/(get(names[1])-get(names[4])))*(peth-pair)+pair,
                         BDens = (get(names[2])/(get(names[2])-get(names[5])))*(peth-pair)+pair,
                         CDens = (get(names[3])/(get(names[3])-get(names[6])))*(peth-pair)+pair)
                 ][,  .(ADens_mean = mean(ADens),
                           ADens_sd = sd(ADens),
                           AErr =     (sqrt((sd(get(names[1]))/mean(get(names[1])))^2) + 
                                     (sqrt((sd(get(names[1]))^2 + sd(get(names[4]))^2))/
                                        (mean(get(names[1])) - mean(get(names[4]))))^2)* mean(ADens),
                           BDens_mean = mean(BDens),
                           BDens_sd = sd(BDens),
                           BErr = (sqrt((sd(get(names[2]))/mean(get(names[2])))^2) + 
                                     (sqrt((sd(get(names[2]))^2 + sd(get(names[5]))^2))/
                                        (mean(get(names[2])) - mean(get(names[5]))))^2)* mean(BDens),
                           CDens_mean = mean(CDens),
                           CDens_sd = sd(CDens),
                           CErr = (sqrt((sd(get(names[3]))/mean(get(names[3])))^2) + 
                                     (sqrt((sd(get(names[3]))^2 + sd(get(names[6]))^2))/
                                        (mean(get(names[3])) - mean(get(names[6]))))^2)* mean(CDens))
                   ]
}

rbindlist(lapply(list_datasets, my_func, peth = 2, pair = 1))
现在,假设您将原始向量按列在示例中出现的顺序放入数据帧中,并且这些列是数据集中唯一的列。如果不是这样,您可能只需要编辑names[x]调用中的索引。如果您想拥有更大的灵活性,还可以定义一个列表,其中包含各个原始数据集中每个数据集的列名,将其作为参数添加到my_func中,然后用getlist_column_names[x]替换名称[x]的所有实例

此函数应输出一个data.table,其中包含每组数据集1-16的结果,每行有6列ADens_mean、ADens_sd、


注意,由于没有实际的数据可供使用,我不能确定这个函数是否完全满足您的需要,但我认为它会很接近。这还需要您下载data.table包。

您通过顺序命名变量、在对象名称中编码信息,给自己制造了麻烦。而是你。迭代一个列表并将结果存储在另一个列表中很容易。或者,如果您的数据不能同时全部放入内存,请编写一个以文件名为输入参数的函数,并迭代文件名而不是R对象名。非常感谢Gregor,请阅读有关数据帧列表的全部内容,我马上就去试试。处理关于错误传播的长长的计算线的最佳方法是什么???@Gregor我设法列出了清单,等等,但我认为我对R来说太新了,无法处理这些代码密集的解决方案。非常感谢你的帮助,如果我真的很接近,请告诉我,如果不是,我将带着大量的数据帧回到奴隶制。。。。将我的列表图片添加到原始帖子的底部!!您的数据帧列表看起来是正确的。现在,您应该能够将其应用于我下面给出的函数。你可以在列表中添加错误传播函数mean=mean x,sd=sd x我想你很接近了,我会试试你写的和Gregor在R中建议的。如果失败,我可能会返回给你…@Chemistry101查看编辑过的函数,这将为您的列表中的每个数据帧提供所有计算,作为output data.table中的一行。这看起来有点麻烦,但它应该能够完成任务并运行良好quickly@Chemistry101为了澄清我的上一条评论,当重新阅读时,似乎可能会混淆输入列表中的每个数据帧将与output data.table中的一行相对应,也就是说,如果您有16个数据帧,那么您的输出将是16行。很多时候,16行数据帧的输出正是我所需要的。我现在很忙,但稍后会尝试,希望成功!