将系列计算应用于R

时间:2017-03-19 21:20:10

标签: 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$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占位符的可加载脚本,我们可以轻松插入A_1_1?

在此先感谢,我尽量将混乱的数量保持在最低限度,尽管这很难!

Data list

1 个答案:

答案 0 :(得分:1)

如果您将原始数据组合成数据帧(甚至更好data.tables)而不是单个矢量,然后将所有运行的所有数据帧存储到@Gregor建议的列表中,您可以使用此功能下面和lapply功能。

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,然后替换所有实例具有names[x]

get(list_column_names[x])

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

注意,因为没有可用的实际数据,我不能肯定地说这个功能完全符合您的要求,但我认为它会很接近。这还需要您下载data.table包。