【问题标题】:Use lag function in R to call multiple values在 R 中使用 lag 函数调用多个值
【发布时间】:2021-01-12 10:16:23
【问题描述】:

我提出了一个类似的问题:If condition is met, go 6 rows above and select the value in R,我得到了一个非常有用的答案。

现在我尝试调用而不是像上一个主题中那样调用 1 个值,而是调用多行。

样本数据:

    md2 <- structure(list(Hdwy = c(45.01, 45.03, 449, 44.46, 43.63, 425, 
41.36, 40.53, 40.1, 39.97, 39.98, 40, 40, 40, 40, 41.36, 40.53, 
40.1, 40, 40), L_ID = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 1)), class = "data.frame", row.names = c(NA, 
-20L))

我用过:

library(dplyr)
spc <- md2 %>%
         mutate(Lag = lag(Hdwy, (1:6)) %>%
         filter(L_ID==1) %>%
         pull(Lag)
spc

期待看到:

> spc 44.46, 43.63, 425, 
>     41.36, 40.53, 40.1

但我得到了错误:

错误:mutate() 输入 Lag 有问题。 x n 必须是 非负整数标量,不是长度为 200 的整数向量。 i 输入Lag 是`lag(Hdwy, (1:6))

有什么想法吗?我应该改用其他函数吗?

【问题讨论】:

    标签: r rows lag


    【解决方案1】:

    lag 只能接受 1 个数字,您可以尝试滚动操作。

    library(dplyr)
    
    md2 %>% 
      mutate(Lag = lead(zoo::rollapply(L_ID == 1, 6, any, fill = NA, align = 'left'))) %>%
      filter(Lag) %>%
      pull(Hdwy)
    
    #[1]  44.46  43.63 425.00  41.36  40.53  40.10  40.00
    

    我确实得到了另一个值 40,对应于最后一个 1。

    如果你想从每个 1 中获取所有 6 个值,你可以试试这个 base R 选项。

    inds <- which(md2$L_ID == 1)
    md2$Hdwy[unique(sort(c(sapply(inds, `-`, 1:6))))]
    

    【讨论】:

    • 非常感谢!我尝试了滚动操作并且有效。如果我想在值之后移动 6 行,而不是这样写: md2 %>% mutate(Lag = lead(zoo::rollapply(L_ID == 1, - 6, any, fill = NA, align = 'left'))) %>% filter(Lag) %>% pull(Hdwy) ??
    • 要获取之后的值,您可以使用 mutate(Lag = lag(zoo::rollapply(L_ID == 1, 6, any, fill = NA, align = 'right'))) 保持剩余部分相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2021-05-11
    • 2021-04-11
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多