取一行中第一和最后观察值之间的差异,其中每一行都不同

qua*_*ace 4 r dplyr tidyverse

我的数据如下所示:

  Region X2012 X2013 X2014 X2015 X2016 X2017
1      1    10    11    12    13    14    15
2      2    NA    17    14    NA    23    NA
3      3    12    18    18    NA    23    NA
4      4    NA    NA    15    28    NA    38
5      5    14  18.5    16    27    25    39
6      6    15    NA    17  27.5    NA    39
Run Code Online (Sandbox Code Playgroud)

这些数字在这里无关紧要,但是我想做的是将每一行最早和最新观察到的点之间的差取为新的列,以区别:

Region              Diff
     1     (15 - 10) = 5
     2     (23 - 17) = 6
Run Code Online (Sandbox Code Playgroud)

依此类推,实际上并没有显示减法,而是最终结果。理想情况下,我只是从2012列中减去2017列,但是由于任何行的第一个观察结果都可以在任何列开始,也可以在任何列结束,因此我不确定如何取其差。

dplyr解决方案将是理想的选择,但任何解决方案都值得赞赏。

G. *_*eck 5

定义一个函数,该函数将其向量参数的最后一个减去第一个元素,从而省略NA,并将其应用于每一行。

lastMinusFirst <- function(x, y = na.omit(x)) tail(y, 1) - y[1]
transform(DF, diff = apply(DF[-1], 1, lastMinusFirst))
Run Code Online (Sandbox Code Playgroud)

给予:

  Region X2012 X2013 X2014 X2015 X2016 X2017 diff
1      1    10  11.0    12  13.0    14    15    5
2      2    NA  17.0    14    NA    23    NA    6
3      3    12  18.0    18    NA    23    NA   11
4      4    NA    NA    15  28.0    NA    38   23
5      5    14  18.5    16  27.0    25    39   25
6      6    15    NA    17  27.5    NA    39   24
Run Code Online (Sandbox Code Playgroud)

注意

可复制形式的输入:

Lines <- "Region X2012 X2013 X2014 X2015 X2016 X2017
1      1    10    11    12    13    14    15
2      2    NA    17    14    NA    23    NA
3      3    12    18    18    NA    23    NA
4      4    NA    NA    15    28    NA    38
5      5    14  18.5    16    27    25    39
6      6    NA    NA    NA    NA    NA    NA"
DF <- read.table(text = Lines)
Run Code Online (Sandbox Code Playgroud)

更新资料

固定。