2017-02-28 1 views
1

Mit dieser data.framedplyr: Differenz zwischen bestimmten Zeilen

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) 

Die ersten 10 Seiten sind unabhängige (keine Website sind upstream). Aber die letzten 6 Seiten sind abhängig, da sie eine oder mehrere Seiten enthalten, wie unten gezeigt.

Ich möchte zwei neue Spalten erstellen measured_diff und simulated_diff. Die Werte in diesen Spalten sind unabhängig was bedeutet, dass für die letzten sechs Standorte die Upstream-Site (s) von abhängigen Websites subtrahiert werden, wie unten gezeigt.

ENDERGEBNIS

es so

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

sein sollte ich irgendwelche Vorschläge zu schätzen wissen werden, wie dies zu tun in R?

+0

Dies scheint wie eine benutzerdefinierte Berechnung anstelle von Mustern – akrun

Antwort

1

Wie @akrun sagte, gibt es hier kein wirkliches Muster ist, so dass Sie etwas tun können:

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

Und dann können Sie die gleiche Alternative für df$simulated.diff

tun, da Sie tun die gleiche benutzerdefinierte Berechnung mehr als einmal, macht es Sinn, Ihre eigene benutzerdefinierte Funktion zu erstellen.

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

Vielen Dank für Ihre Zeit und Hilfe. – aelwan

Verwandte Themen