计算相对于R数据框中特定因子的值

时间:2015-04-23 00:04:08

标签: r dataframe

我在R中有以下格式的数据框:

        BC solvopt istrng tSolv      EPB
    1   10       1      0  0.10 -78.1450
    2   10       1      1  0.15 -78.7174
    3   10       1     10  0.14 -78.7175
    4   10       1    100  0.12 -78.7184
    5   10       1   1000  0.09 -78.7232
    6   10       1      2  0.15 -78.7175
    7   10       1     20  0.14 -78.7176
    8   10       1    200  0.12 -78.7192
    30  10       2      0  0.10 -78.1450
    31  10       2      1  0.11 -78.7174
    32  10       2     10  0.11 -78.7175
    33  10       2    100  0.10 -78.7184
    34  10       2   1000  0.13 -78.7232
    35  10       2      2  0.11 -78.7174
    36  10       2     20  0.10 -78.7176
    37  10       2    200  0.10 -78.7192
    59  10       3      0  0.16 -78.1450
    60  10       3      1  0.23 -78.7174
    61  10       3     10  0.21 -78.7175
    62  10       3    100  0.19 -78.7184
    63  10       3   1000  0.17 -78.7232
    64  10       3      2  0.22 -78.7175
    65  10       3     20  0.21 -78.7176
    66  10       3    200  0.18 -78.7192
    88  10       4      0  0.44 -78.1450
    89  10       4      1 14.48 -78.7162
    90  10       4     10 12.27 -78.7175
    91  10       4    100  1.23 -78.7184
    92  10       4   1000  0.44 -78.7232
    93  10       4      2 14.52 -78.7172
    94  10       4     20  6.16 -78.7176
    95  10       4    200  0.62 -78.7192

我想在此框架中添加一列,显示相对于solvopt = 3的每个BC值和相对于每个值的EPB的相对误差。

例如,要计算每行EPB的相对差异,我会用相同的BC和istrng值减去相应行的EPB值,但是使用solvopt = 3.

有没有一种简单的方法可以做到这一点,将其分成多个数据帧(对于每个solvopt),然后将它们一起重新组合?

最终目标是使用qplot为BC的每个值生成相对误差与istrng的关系图。

2 个答案:

答案 0 :(得分:1)

如果merge solvopt==3BCistrong上的主要数据newdat <- merge(dat,dat[dat$solvopt==3,c("BC","istrng","EPB")], by=c("BC","istrng")) newdat$diff <- with(newdat, EPB.x - EPB.y) 的子集,并减去差异,则应获得所需的结果,例如: :

match

...或者使用interactiondat$diff <- dat$EPB - dat[dat$solvopt==3,"EPB"][match( with(dat, interaction(BC,istrng) ), with(dat[dat$solvopt==3,], interaction(BC,istrng) ) )] 一步一步完成:

Rnol = Pnol + Qnol + Nnol;

答案 1 :(得分:1)

data.table

的类似选项
library(data.table)
 res <- setkey(setDT(dat), BC,istrng)[dat[solvopt==3, c(1,3,5),
                 with=FALSE]][, diff:= EPB- i.EPB][]