带R中函数的多列滞后值

带R中函数的多列滞后值,r,function,dplyr,lag,R,Function,Dplyr,Lag,我想为R中的多个列创建滞后值 首先,我使用一个函数来创建超前/滞后,如下所示: mleadlag <- function(x, n, ts_id) { pos <- match(as.numeric(ts_id) + n, as.numeric(ts_id)) x[pos] } set.seed(42) ## for sake of reproducibility n <- 6 dat <- data.frame(company=1:n

我想为R中的多个列创建滞后值

首先,我使用一个函数来创建超前/滞后,如下所示:

mleadlag <- function(x, n, ts_id) {
        pos <- match(as.numeric(ts_id) + n, as.numeric(ts_id))
        x[pos]
}
set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(company=1:n, 
                  fye=2009,
                  x=rnorm(n),
                  y=rnorm(n),
                  z=rnorm(n),
                  k=rnorm(n),
                  m=rnorm(n))
dat2 <- data.frame(company=1:n, 
                   fye=2010,
                   x=rnorm(n),
                   y=rnorm(n),
                   z=rnorm(n),
                   k=rnorm(n),
                   m=rnorm(n))
dat3 <- data.frame(company=1:n, 
                   fye=2011,
                   x=rnorm(n),
                   y=rnorm(n),
                   z=rnorm(n),
                   k=rnorm(n),
                   m=rnorm(n))
df <- rbind(dat,dat2,dat3)

mleadlag我会尽量远离tidyverse中的循环。许多传统上需要循环的tidyverse应用程序已经存在,并且速度非常快,这会创建更高效、更直观的代码(我认为是后者)。这是dplyr的
cross()
功能的一个很好的用例。我首先将
df
更改为
tibble

df %>% 
 as_tibble() %>%
 group_by(company) %>% 
 mutate(
   across(firm.characteristics, ~lag(., 1L))
 ) %>% 
 ungroup()

这将生成所需的滞后值。有关更多信息,请参阅dplyr的所有文档。

如果您创建一个小的可复制示例以及预期输出,将更容易提供帮助。阅读。没有数据,很难调查这件事。如果您对其他方法持开放态度,我在GitHub上提供了一个可能会有所帮助的包:。自述文件中的前两个例子应该包括这个案例。@Ronaksah对此表示抱歉。我在问题中加入了小样本。希望这会更容易见到Hi Griff,谢谢您的回复。我有一个简单的问题,想象一下,在我们的df中,我们有一些非连续年份的公司。所以,通过这样做,他们可以为非连续年份的滞后变量输入NA值。你们能提供一些示例数据吗?干杯
df %>% 
 as_tibble() %>%
 group_by(company) %>% 
 mutate(
   across(firm.characteristics, ~lag(., 1L))
 ) %>% 
 ungroup()