新的计算循环

时间:2013-02-05 05:46:35

标签: r loops if-statement

我希望有一个循环来为我执行计算,并将变量(以及识别信息)导出到新的数据框中。

我的数据如下:

每个唯一采样点(UNIQUE)有4个与之关联的数据点(它们因WAVE而不同)。

   WAVE REFLECT REFEREN PLOT LOCAT COMCOMP     DATE UNIQUE
1 679.9     119       0    1     1       1 11.16.12      1
2 799.9     119       0    1     1       1 11.16.12      1
3 899.8     117       0    1     1       1 11.16.12      1
4 970.3     113       0    1     1       1 11.16.12      1
5 679.9     914   31504    1     2       1 11.16.12      2
6 799.9    1693   25194    1     2       1 11.16.12      2

我想创建一个如下所示的新数据框: 对于每个独特的采样点,我想从2个特定的“WAVE”测量值计算“WBI”。

WBI                     PLOT   ....  UNIQUE
(WAVE==899.8/WAVE==970)    1              1
(WAVE==899.8/WAVE==970)    1              2
(WAVE==899.8/WAVE==970)    1              3

1 个答案:

答案 0 :(得分:0)

取决于输入data.frame的大小,在效率方面可能有更好的解决方案,但以下内容适用于中小型数据集,并且很简单:

out.unique = unique(input$UNIQUE);

out.plot = sapply(out.unique,simplify=T,function(uq) {
    # assuming that plot is simply the first PLOT of those belonging to that
    # unique number. If not yo should change this.
    subset(input,subset= UNIQUE == uq)$PLOT[1];
});

out.wbi = sapply(out.unique,simplify=T,function(uq) {
    # not sure how you compose WBI but I assume that are the two last 
    # record with that unique number so it matches the first output of your example
    uq.subset = subset(input,subset= UNIQUE == uq);
    uq.nrow = nrow(uq.subset);
    paste("(WAVE=",uq.subset$WAVE[uq.nrow-1],"/WAVE=",uq.subset$WAVE[uq.nrow],")",sep="")
});

output = data.frame(WBI=out.wbi,PLOT=out.plot,UNIQUE=out.unique);

如果输入数据很大,你可能想利用记录似乎按“UNIQUE”排序的事实;重复的data.frame子设置将是昂贵的。另外两个蓝调电话都可以组合成一个但是让它更麻烦,所以我就这样离开了。