从数据框中的前一列中减去每一列

Subtracting each column from its previous one in a data frame

我这里有一个非常简单的案例,我想从前一列中减去每一列。事实上,我正在寻找滑动减法,因为第一列保持原样,然后第一列减去第二列,第二列减去第三列,依此类推直到最后一列。 这是我的示例数据集:

structure(list(x = c(1, 0, 0, 0), y = c(1, 0, 1, 1), z = c(0, 
1, 1, 1)), class = "data.frame", row.names = c(NA, -4L))

和我想要的输出:

structure(list(x = c(1, 0, 0, 0), y = c(0, 0, 1, 1), z = c(-1, 
1, 0, 0)), class = "data.frame", row.names = c(NA, -4L))

我个人正在寻找具有 purrr 系列函数的解决方案。我也想过 slider 但我对后者不太熟悉。因此,我将提前感谢这两个软件包的任何帮助和想法。非常感谢。

我认为您正在寻找 pmap_dflag 来减去之前的值。

library(purrr)
library(dplyr)

pmap_df(df, ~{x <- c(...);x - lag(x, default = 0)})

# A tibble: 4 x 3
#      x     y     z
#  <dbl> <dbl> <dbl>
#1     1     0    -1
#2     0     0     1
#3     0     1     0
#4     0     1     0

冗长但简单:

df %>%
  select(x) %>%
  bind_cols(df %>%
             select(-1) %>%
             map2_dfc(df %>%
                         select(-ncol(df)), ~.x -.y))

#  x y  z
#1 1 0 -1
#2 0 0  1
#3 0 1  0
#4 0 1  0

一个简单的dplyr唯一的解决方案-

  • cur_data() inside mutate/summarise 只是创建了一个完整的副本。所以
  • 只需从 cur_data()[-1]
  • 中减去 cur_data()[-ncol(.)]
  • pmap_df 你可以做类似的事情
df <- structure(list(x = c(1, 0, 0, 0), y = c(1, 0, 1, 1), z = c(0, 
                                                           1, 1, 1)), class = "data.frame", row.names = c(NA, -4L))


library(dplyr)

df %>% 
  mutate(cur_data()[-1] - cur_data()[-ncol(.)])
#>   x y  z
#> 1 1 0 -1
#> 2 0 0  1
#> 3 0 1  0
#> 4 0 1  0

同样

pmap_dfr(df, ~c(c(...)[1], c(...)[-1] - c(...)[-ncol(df)]))

我们可以做到(不需要任何包)

cbind(df1[1], df1[-1] - df1[-ncol(df1)])

-输出

 x y  z
1 1 0 -1
2 0 0  1
3 0 1  0
4 0 1  0

或使用dplyr

library(dplyr)
df1 %>%
      mutate(.[-1] - .[-ncol(.)])