2015-04-23 80 views
2

我有以下形式的R A數據幀:計算值相對於特定因子在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)多個數據幀這個,然後remunging一起?

的最終目標是產生相對誤差的曲線VS istrng使用qplot BC的每個值。

+0

我覺得我得到你想要的東西,但你可以讓你的數據。例如已經爲'solvopt = 3'一對夫婦的情況下這樣一個完整的解決方案,可以提供? – thelatemail

回答

1

如果merge子集,其中solvopt==3對雙方BCistrong,和主數據減去區別,你應該得到你想要的結果,例如:

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

...或做這一切一舉使用matchinteraction

dat$diff <- dat$EPB - dat[dat$solvopt==3,"EPB"][match(
    with(dat,     interaction(BC,istrng)), 
    with(dat[dat$solvopt==3,], interaction(BC,istrng)) 
)] 
+0

太棒了,他們的工作就像一個魅力。我從來沒有玩過合併或匹配+互動之前。這比分割成幾個幀並手動添加要容易得多。謝謝! – wmsmith

+0

@wmsmith - 沒有問題。我估計祕密R的努力沒有想到在'爲(i的N)'零碎環的方式,但要找到一個「塊」的解決方案,將盡一切一氣呵成的核心業務。這是從許多其他語言的心態變化。 – thelatemail

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][]