新变量:由不同列的值驱动的列表中的数字总和

时间:2018-02-14 12:58:06

标签: r

这是我在Stackoverflow中的第一个问题。我不是R的新手,虽然我有时会对那些可能被认为是基本的东西感到困惑。

我想从粒度分布数据集中计算每行的计数中值直径(CMD)。

我的数据看起来像这样(总共有几行和53列):

               date      CPC   n3.16   n3.55   n3.98   n4.47   n5.01   n5.62    n6.31    n7.08    n7.94
2015-01-01 00:00:00 5263.434  72.988 140.346 138.801 172.473 344.806 484.415  606.430  739.625  927.082
2015-01-01 01:00:00 4813.182 152.823  80.861 140.017 213.382 264.496 359.455  487.293  840.349 1069.846

每个变量以" n"开头。表示相应尺寸的颗粒数(变量n3.16 =中值尺寸为3.16nm的颗粒数)。我会在计算之前将值除以100,以避免出现阻止计算的高数字。

要计算CMD,我需要进行以下计算:

  

CMD = (D1^n1*D2^n2...Di^ni)^(1/N)

其中 Di 是直径(从列名中提取), ni 是直径 Di 的粒子数,以及N是粒子的总和(所有列的总和以&#34开头; n")。

要获取 Di ,我从以n开头的列名创建了一个数字列表:

D <- as.numeric(gsub("n", "", names(data)[3:54]))

这是我尝试使用CMD计算创建一个新变量,尽管它不起作用。

data$cmd <- for i in 1:ncol(D) {
  prod(D[[i]]^data[,i+2])
}

我也试过使用申请,但我再次,它没有工作

data$cmd <- for i in 1:ncol(size) {
apply(data,1, function(x) prod(size[[i]]^data[,i+2])
}

我有来自不同网站的不同数据集,这些数据集具有不同的列数,因此我想制作代码&#34; universal&#34;。

非常感谢

1 个答案:

答案 0 :(得分:1)

这应该有效(由于date我不得不毁掉你的read.table变量,但它不参与计算,所以只需忽略它:)

> df
        date      CPC   n3.16   n3.55   n3.98   n4.47   n5.01   n5.62   n6.31   n7.08    n7.94
1 2015-01-01 5263.434  72.988 140.346 138.801 172.473 344.806 484.415 606.430 739.625  927.082
2 2015-01-01 4813.182 152.823  80.861 140.017 213.382 264.496 359.455 487.293 840.349 1069.846

N <- sum(df[3:11]) # did you mean the sum of all n.columns over all rows? if not, you'd need to edit this
> N
[1] 7235.488

D <- as.numeric(gsub("n", "", names(df)[3:11]))
> D
[1] 3.16 3.55 3.98 4.47 5.01 5.62 6.31 7.08 7.94

new <- t(apply(df[3:11], 1, function(x, y) (x^y), y = D))
> new
         n3.16    n3.55     n3.98       n4.47        n5.01        n5.62        n6.31        n7.08        n7.94
[1,]  772457.6 41933406 336296640  9957341349 5.167135e+12 1.232886e+15 3.625318e+17 2.054007e+20 3.621747e+23
[2,] 7980615.0  5922074 348176502 25783108893 1.368736e+12 2.305272e+14 9.119184e+16 5.071946e+20 1.129304e+24

df$CMD <- rowSums(new)^(1/N)

> df
        date      CPC   n3.16   n3.55   n3.98   n4.47   n5.01   n5.62   n6.31   n7.08    n7.94      CMD
1 2015-01-01 5263.434  72.988 140.346 138.801 172.473 344.806 484.415 606.430 739.625  927.082 1.007526
2 2015-01-01 4813.182 152.823  80.861 140.017 213.382 264.496 359.455 487.293 840.349 1069.846 1.007684