从数据框中的前一列中减去每一列
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_df
和 lag
来减去之前的值。
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(.)])
我这里有一个非常简单的案例,我想从前一列中减去每一列。事实上,我正在寻找滑动减法,因为第一列保持原样,然后第一列减去第二列,第二列减去第三列,依此类推直到最后一列。 这是我的示例数据集:
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_df
和 lag
来减去之前的值。
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]
中减去 - 用
pmap_df
你可以做类似的事情
cur_data()[-ncol(.)]
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(.)])