我的数据如下所示:
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
这里的数字无关紧要,但我想做的是取每行中最早和最新观察点之间的差异,为差异创建一个新列,其中:
Region Diff
1 (15 - 10) = 5
2 (23 - 17) = 6
依此类推,实际上不显示减法,而是显示最终结果。理想情况下,我只是从 2012 列中减去 2017 列,但由于任何行的第一次观察都可以从任何列开始,也可以在任何列结束,我不确定如何计算差异。
dplyr 解决方案将是理想的,但任何解决方案都值得赞赏。
最佳答案
定义一个函数,将其向量参数的最后一个元素减去第一个元素(省略 NA)并将其应用于每一行。
lastMinusFirst <- function(x, y = na.omit(x)) tail(y, 1) - y[1]
transform(DF, diff = apply(DF[-1], 1, lastMinusFirst))
给予:
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
注意
可重现形式的输入:
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)
更新
已修复。
关于r - 计算一行中第一个和最后一个观察值之间的差异,其中每行都不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57437497/