假设我有以下data.frame df
:
set.seed(1)
df = data.frame(a = rnorm(10),
b = rnorm(10),
c = rnorm(10),
d = rnorm(10))
> df
a b c d
1 -0.6264538 1.51178117 0.91897737 1.35867955
2 0.1836433 0.38984324 0.78213630 -0.10278773
3 -0.8356286 -0.62124058 0.07456498 0.38767161
4 1.5952808 -2.21469989 -1.98935170 -0.05380504
5 0.3295078 1.12493092 0.61982575 -1.37705956
6 -0.8204684 -0.04493361 -0.05612874 -0.41499456
7 0.4874291 -0.01619026 -0.15579551 -0.39428995
8 0.7383247 0.94383621 -1.47075238 -0.05931340
9 0.5757814 0.82122120 -0.47815006 1.10002537
10 -0.3053884 0.59390132 0.41794156 0.76317575
我希望将b
,c
和d
列(仅)上移3行。 a
列必须保持固定,并且删除NAs
的行。
这里是我希望的输出,用于移动3行:
> df_shift_3
a b c d
1 -0.6264538 -2.21469989 -1.98935170 -0.05380504
2 0.1836433 1.12493092 0.61982575 -1.37705956
3 -0.8356286 -0.04493361 -0.05612874 -0.41499456
4 1.5952808 -0.01619026 -0.15579551 -0.39428995
5 0.3295078 0.94383621 -1.47075238 -0.05931340
6 -0.8204684 0.82122120 -0.47815006 1.10002537
7 0.4874291 0.59390132 0.41794156 0.76317575
我如何创建一个函数来对up
行的down
或n
移位进行通用输出?
我尝试使用以下功能https://rdrr.io/cran/useful/man/shift.column.html,但没有成功。
感谢您的帮助
答案 0 :(得分:2)
dplyr的lead/lag
函数对此很有帮助。 df %>% mutate_at(-1, ~lead(., 3)) %>% slice(1:(n()-3))
您可以使其成为函数
shift_all_but_first <- function(data, N) data %>% mutate_at(-1, ~lead(., N)) %>% slice(1:(n()-N))
shift_all_but_first(df, 3)