首页 > 解决方案 > 用两行中的值减去所有列

问题描述

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

标签: rrowssubtraction

解决方案


数据

> 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()


推荐阅读