dplyr:特定行之间的差异

时间:2017-02-28 02:19:09

标签: r dplyr

使用此data.frame

数据

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?

中有任何建议,我将不胜感激

1 个答案:

答案 0 :(得分: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)
相关问题