How to lag a specific column of a data frame in R

∥☆過路亽.° 提交于 2021-02-11 13:38:05

问题


Input (Say d is the data frame below.)

a  b  c
1  5  7
2  6  8
3  7  9

I want to shift the contents of column b one position down and put an arbitrary number in the first position in b. How do I do this? I would appreciate any help in this regard. Thank you.

I tried c(6,tail(d["b"],-1)) but it does not produce (6,5,6).

Output

a  b  c
1  6  7
2  5  8
3  6  9

回答1:


Use head instead

df$b <- c(6, head(df$b, -1))
#  a b c
#1 1 6 7
#2 2 5 8
#3 3 6 9

You could also use lag in dplyr

library(dplyr)
df %>% mutate(b = lag(b, default = 6))

Or shift in data.table

library(data.table)
setDT(df)[, b:= shift(b, fill = 6)]



回答2:


A dplyr solution uses lag with an explicit default argument, if you prefer:

library(dplyr)

d <- tibble(a = 1:3, b = 5:7, c = 7:9)

d %>% mutate(b = lag(b, default = 6))
#> # A tibble: 3 x 3
#>       a     b     c
#>   <int> <dbl> <int>
#> 1     1     6     7
#> 2     2     5     8
#> 3     3     6     9

Created on 2019-12-05 by the reprex package (v0.3.0)




回答3:


Here is a solution similar to the head approach by @Ronak Shah

df <- within(df,b <- c(runif(1),b[-1]))

where a uniformly random variable is added to the first place of b column:

> df
  a         b c
1 1 0.6644704 7
2 2 6.0000000 8
3 3 7.0000000 9



回答4:


Best solution below will help in any lag or lead position

d <- data.frame(a=c(1,2,3),b=c(5,6,7),c=c(7,8,9))

d1 <- d %>% arrange(b) %>% group_by(b) %>% 
mutate(b1= dplyr::lag(b, n = 1, default = NA))


来源:https://stackoverflow.com/questions/59191785/how-to-lag-a-specific-column-of-a-data-frame-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!