用两行中的值减去所有列

Substracting all columns by the values in two rows

如果我想获取第 2 行中的所有列并将它们减去第 1 行中的值,我应该使用什么代码。我想在整个数据集中执行此操作。即第4行-第3行,第6行-第5行,依此类推。

数据

> mtcars[1:3, ]
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

使用基数 R

as.data.frame(lapply(mtcars[1:3, ], function(x) c(NA, diff(x))))

  mpg cyl disp  hp  drat     wt qsec vs am gear carb
1  NA  NA   NA  NA    NA     NA   NA NA NA   NA   NA
2 0.0   0    0   0  0.00  0.255 0.56  0  0    0    0
3 1.8  -2  -52 -17 -0.05 -0.555 1.59  1  0    0   -3

使用 dplyr:

library(dplyr)

选项 1

> mutate(mtcars[1:3, ], across(everything(), ~. - lag(.)))
  mpg cyl disp  hp  drat     wt qsec vs am gear carb
1  NA  NA   NA  NA    NA     NA   NA NA NA   NA   NA
2 0.0   0    0   0  0.00  0.255 0.56  0  0    0    0
3 1.8  -2  -52 -17 -0.05 -0.555 1.59  1  0    0   -3

选项 2

> mutate_all(mtcars[1:3, ], ~. - lag(.))
  mpg cyl disp  hp  drat     wt qsec vs am gear carb
1  NA  NA   NA  NA    NA     NA   NA NA NA   NA   NA
2 0.0   0    0   0  0.00  0.255 0.56  0  0    0    0
3 1.8  -2  -52 -17 -0.05 -0.555 1.59  1  0    0   -3

在这段代码中,~. - lag(.) 是一个匿名函数,就像 function(x) x - lag(x) 一样。

如果您的数据包含非数字变量,为了不出错,您可以使用 mutate_if(your_data, is.numeric, ~. - lag(.)) 或新方法的变体 across().