0

我想要一个循环来为我执行计算,并将变量(连同识别信息)导出到一个新的数据框中。

我的数据如下所示:

每个唯一的采样点 (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
4

1 回答 1

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);

但是,如果输入数据很大,您可能想利用记录似乎按“唯一”排序的事实;重复的 data.frame 子设置会很昂贵。此外,两个 sapply 调用都可以合并为一个,但会更麻烦,所以我就这样离开了。

于 2013-02-05T13:52:57.570 回答