2017-02-28 54 views
1

之間差使用這種data.framedplyr:特定行

DATA

df <- read.table(text = c(" 
       id measured simulated 
Site1 9.10 9.20 
Site2 126.00 129.02 
Site3 1.00 1.15 
Site4 84.50 85.77 
Site5 115.60 119.30 
Site6 12.10 12.26 
Site7 163.10 167.18 
Site8 74.10 75.51 
Site9 19.20 19.74 
Site10 74.80 77.12 
Site11 287.80 300.46 
Site12 13.40 13.76 
Site13 283.60 288.70 
Site14 475.70 495.68 
Site15 741.20 779.74 
Site16 2215.10 2398.95 "), header = T) 

前10位點獨立(不包括上游的任何位點)。但是最後6個站點是,依賴於,因爲它們包含一個或多個站點,如下所示。

我想創建兩個新列measured_diffsimulated_diff。這些列中的值將是獨立這意味着對於最後六個站點,上游站點將從任何相關站點中減去,如下所示。

最終結果

它應該是這樣的

#  id measured simulated measured_diff simulated_diff 
#1 Site1  9.1  9.20   9.1   9.20 #independent 
#2 Site2 126.0 129.02   126.0   129.02 #independent 
#3 Site3  1.0  1.15   1.0   1.15 #independent 
#4 Site4  84.5  85.77   84.5   85.77 #independent 
#5 Site5 115.6 119.30   115.6   119.30 #independent 
#6 Site6  12.1  12.26   12.1   12.26 #independent 
#7 Site7 163.1 167.18   163.1   167.18 #independent 
#8 Site8  74.1  75.51   74.1   75.51 #independent 
#9 Site9  19.2  19.74   19.2   19.74 #independent 
#10 Site10  74.8  77.12   74.8   77.12 #independent 
#11 Site11 287.8 300.46   161.8   171.44 #site11 - site2 
#12 Site12  13.4  13.76   12.4   12.61 #site12 - site3 
#13 Site13 283.6 288.70   199.1   202.94 #site13 - site4 
#14 Site14 475.7 495.68   298.2   313.59 #site14-(site3+site7+site12) 
#15 Site15 741.2 779.74   280.4   309.47 #site15-(site1+site8+site9+site10+site13) 
#16 Site16 2215.1 2398.95   582.7   691.51 #site16-(site5+site6+site11+site14+site15) 

我歡迎任何建議,如何做到這一點的R'

+0

這似乎是一個自定義計算,而不是任何模式 – akrun

回答

1

像@akrun說,沒有真正的模式在這裏,所以你可以做這樣的事情:

df$measured.diff = with(df, c(measured[1:10], 
           measured[11:13]-measured[2:4], 
           measured[14]-sum(measured[c(3,7,12)]), 
           measured[15]-sum(measured[c(1,8,9,10,13)]), 
           measured[16]-sum(measured[c(5,6,11,14,15)]))) 

然後你可以爲df$simulated.diff

做同樣的選擇,由於你正在做的相同的自定義計算不止一次,創建您自己的自定義函數是有意義的。

custom_diff = function(vec){ 
    c(vec[1:10], 
    vec[11:13]-vec[2:4], 
    vec[14]-sum(vec[c(3,7,12)]), 
    vec[15]-sum(vec[c(1,8,9,10,13)]), 
    vec[16]-sum(vec[c(5,6,11,14,15)])) 
} 

df$measured.diff = custom_diff(df$measured) 
df$simulated.diff = custom_diff(df$simulated) 
+0

非常感謝您的時間和幫助。 – aelwan