R语言 获取当前列与前一列之间的差异

efzxgjgh  于 2023-04-27  发布在  其他
关注(0)|答案(5)|浏览(143)

我有一个类似下面的dataframe:

df <- data.frame(a = c(1, 2, 3), b = c(4, 15, 6), c = c(7, 8, 19))

  a  b  c
1 1  4  7
2 2 15  8
3 3  6 19

我想用每一列与前一列之间的差异替换每一列(同时保留第一列):

a  b  c
1  1  3  3
2  2 13 -7
3  3  3 13

我做到了,但看起来很丑:

df2 = df %>% t %>% as.data.frame %>% 
  mutate(across(everything(), ~ . - lag(.))) %>% t %>% as.data.frame() %>% 
  mutate(a = df$a)

在Python中,你可以指定一个axis选项,告诉lag延迟行或列,但我在R中没有找到类似的东西。

x7rlezfr

x7rlezfr1#

你可以用一个减法来做:

df - cbind(0, df[-length(df)])
#  a  b  c
#1 1  3  3
#2 2 13 -7
#3 3  3 13
5gfr0r5j

5gfr0r5j2#

你也可以在转置 Dataframe 后使用diff

cbind(df[1], t(diff(t(df))))

  a  b  c
1 1  3  3
2 2 13 -7
3 3  3 13
mv1qrgav

mv1qrgav3#

使用rowwiseunnest_widertidyverse方法

library(dplyr)
library(tidyr)

df %>% 
  rowwise() %>% 
  summarize(a, d = list(diff(c_across(everything())))) %>% 
  unnest_wider(d, names_sep="", names_repair=\(x) letters[1:3])
# A tibble: 3 × 3
      a     b     c
  <dbl> <dbl> <dbl>
1     1     3     3
2     2    13    -7
3     3     3    13
aiqt4smr

aiqt4smr4#

不使用包:

data.frame(df$a,t(diff(t(df))))

它产生:

df.a  b  c
1    1  3  3
2    2 13 -7
3    3  3 13

diff计算单元格之间的差异,t()将结果转置为正确的格式,data.frame()再次将其绑定到第一列a。您可能需要重命名第一列(此处命名为df.a)。

zyfwsgd6

zyfwsgd65#

你可以试试

> df[-1] <- df[-1] - df[-length(df)]

> df
  a  b  c
1 1  3  3
2 2 13 -7
3 3  3 13

相关问题