r - 计算一行中第一个和最后一个观察值之间的差异,其中每行都不同

标签 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

这里的数字无关紧要,但我想做的是取每行中最早和最新观察点之间的差异,为差异创建一个新列,其中:

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/

相关文章:

r - dplyr mutate - 如何使用 mutate 正确应用自定义函数?

r - n() 在 summarise_at() 中使用时行为不一致

r - Purrr::map_df() 删除 NULL 行

R:根据向量的顺序对数据框进行排序?

r - 如何比较两个数据框是否具有相同的列名和类?

r - ggplot : "size-robust" way to place horizontal legend at the bottom-right

r - dplyr 中单个数据的概率

r - 如何对饼图中显示变量的颜色进行硬编码?

r - 基于多个现有列顺序生成列

r - 分组并找到最接近的数字