计算与R数据帧中特定因子相关的值

计算与R数据帧中特定因子相关的值,r,dataframe,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

我在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
我想在此框架中添加一列,显示EPB中BC和istrng的每个值相对于solvopt=3的相对误差

例如,为了计算每行EPB的相对差异,我将减去相应行的EPB值,该行的BC和istrng值相同,但solvopt=3

除了将其拆分为多个数据帧(针对每个solvopt)然后将其重新排列在一起之外,有没有一种简单的方法可以做到这一点


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

如果您将
solvopt==3的子集与
BC
istrong
上的主数据合并,然后减去差值,您应该得到您想要的结果,例如:

newdat <- merge(dat,dat[dat$solvopt==3,c("BC","istrng","EPB")], by=c("BC","istrng"))
newdat$diff <- with(newdat, EPB.x - EPB.y)

data.table类似的选项

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

res我想我得到了你想要的,但是你能让你的示例数据有两个案例,用于
solvopt=3
这样就可以提供一个完整的解决方案吗?太棒了,它们工作起来很有魅力。我以前从未玩过合并或匹配+交互。这比拆分成几个帧并手动添加要容易得多。谢谢@wmsmith-没问题。我认为R的秘密不是试图以
for(in n中的I)
逐段循环的方式思考,而是找到一个“块”解决方案,它将一次性完成核心操作。这是许多其他语言的一种思维方式的改变。
library(data.table)
 res <- setkey(setDT(dat), BC,istrng)[dat[solvopt==3, c(1,3,5),
                 with=FALSE]][, diff:= EPB- i.EPB][]