【问题标题】:R - Computations with lag variable by groupr - 按组的滞后变量计算
【发布时间】:2019-09-05 12:58:49
【问题描述】:

使用以下数据集:

set.seed(2)
origin <- rep(c("DEU", "GBR", "ITA", "NLD", "CAN", "MEX", "USA", "CHN", "JPN", "KOR","DEU", "GBR", "ITA", "NLD", "CAN", "MEX", "USA", "CHN", "JPN", "KOR"), 6)
dest <- rep(c("GBR", "ITA", "NLD", "CAN", "MEX", "USA", "CHN", "JPN", "KOR","DEU", "GBR", "ITA", "NLD", "CAN", "MEX", "USA", "CHN", "JPN", "KOR", "DEU"), 6)
year <- rep(c(rep(1998, 10), rep(1999, 10), rep(2000, 10)), 2)
type <- rep(c(1,2,3,4,5), 12)
# type <- sample(1:10, size=length(origin), replace=TRUE)
a <- sample(100:10000, size=length(origin), replace=TRUE)
b <- sample(1000:100000, size=length(origin), replace=TRUE)
data.df <- as.data.frame(cbind(origin, dest, year, type, a,b))
rm(origin, year, dest, type, a,b)

例如,我想计算以下操作:

  • [a t+1 ijk - a t ijk ] * b t sup> ik

我是type,j origin 和 k dest。我决定先用dplyr计算a,lag.a的滞后:

data.df <- data.df %>%
            group_by(origin, dest, type) %>%
            mutate(lag.a = lag(a, n = 1, default = NA))

我认为这种方式是正确的,即使我不太了解 R 如何单独理解要考虑的时间参考是什么...??

顺便说一句,这样做我得到了对应于第一部分的结果(a t+1 ijk - a t ijk ) 我的计算。我的问题是我现在不知道该怎么做 (lag.a t+1 ijk * b t ik )...有什么想法吗?

如果可能的话,我想要一个解决方案(dplyr 或 data.table),不要将滞后变量变异到数据集中,以免对其进行过度加权。

【问题讨论】:

    标签: r dplyr data.table lag


    【解决方案1】:

    您的代码中有几个问题。首先,像这样创建您的data.frame:

    data.df <- data.frame(origin, dest, year, type, a, b)
    

    这将保留所有向量的类。请注意,如果您不希望 origin 和 dest 成为因子,只需在 data.frame() 函数中使用参数 stringsAsFactors = FALSE。

    接下来,按如下方式创建新变量:

    data.df2 <- data.df %>%
      group_by(origin, dest, type) %>%
        arrange(year) %>% 
        mutate(new_var = (a - lag(a)) * b) %>%
      ungroup()
    

    这里,new_var 是您想要的变量。你是对的,dplyr 不知道滞后值来自上一个时间段。因此,您必须使用arrange(year)。

    【讨论】:

    • origin 和 dest 是我的数据集中的有限国家列表(大约 180 个)。因此它可以作为一个分类变量,不是吗?为什么你认为“unstringAsFactors”很有用?
    • 这取决于你。它不会改变任何东西。我刚刚写道,您不能通过使用该论点将它们作为因素。我的解决方案解决了您的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2017-08-21
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多