【问题标题】:How to code for the duration of consecutive monthly "stability" in R如何在 R 中为连续每月“稳定性”的持续时间编码
【发布时间】:2020-09-09 22:35:15
【问题描述】:

我想征求您对 R 编码的建议和指导。具体来说,我的目标是:

  1. 使列上个月值稳定(参见下面的示例):问题是'上个月的值在几个月内连续稳定了多长时间?'

  2. 将列设为“稳定性”(参见下面的示例):我试图显示“连续几个月后 IV 发生变化”。例如,第 1 组的第 10 个月,变化(从 0.2 到 0.4)发生在连续 2 个月(第 8、9 个月)稳定 IV 之后。

  3. 创建“IV 变化”列(参见下面的示例):我想仅显示连续几个月的变化量。例如,第 1 组的第 6 个月到第 8 个月将为“n/a”,因为该组没有第 7 个月。

目前,我有前三列(“Group”、“Month”、“IV”):

structure(list(Group = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2), Month = c(3, 
4, 5, 6, 8, 9, 10, 5, 6, 7, 9), IV = c(0.1, 0.1, 0.5, 0.2, 0.2, 
0.2, 0.4, 0.3, 0.4, 0.4, 0.4)), class = "data.frame", row.names = c(NA, 
-11L), codepage = 65001L)

最终结果如下所示:

structure(list(Group = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2), Month = c(3, 
4, 5, 6, 8, 9, 10, 5, 6, 7, 9), IV = c(0.1, 0.1, 0.5, 0.2, 0.2, 
0.2, 0.4, 0.3, 0.4, 0.4, 0.4), Previous_month_stability = c(NA, 
1, 2, 1, NA, 1, 2, NA, 1, 1, NA), Change_IV = c(NA, 0, 0.4, -0.3, 
NA, 0, 0.2, NA, 0.1, 0, NA), Stability2 = c(NA, 0, 2, 1, NA, 
0, 2, NA, 1, 0, NA)), class = "data.frame", row.names = c(NA, 
-11L), codepage = 65001L)

在表格中,它看起来像:

╔═══════╦═══════╦══════╦══════════════════════════╦══════════════╦════════════╗
║ Group ║ Month ║ IV   ║ Previous_month_stability ║ Change in IV ║ Stability2 ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 1     ║ 3     ║ 0.10 ║ n/a                      ║ n/a          ║ n/a        ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 1     ║ 4     ║ 0.10 ║ 1                        ║ 0            ║ 0          ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 1     ║ 5     ║ 0.50 ║ 2                        ║ 0.40         ║ 2          ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 1     ║ 6     ║ 0.20 ║ 1                        ║ -0.30        ║ 1          ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 1     ║ 8     ║ 0.20 ║ n/a                      ║ n/a          ║ n/a        ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 1     ║ 9     ║ 0.20 ║ 1                        ║ 0            ║ 0          ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 1     ║ 10    ║ 0.40 ║ 2                        ║ 0.2          ║ 2          ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 2     ║ 5     ║ 0.30 ║ n/a                      ║ n/a          ║ n/a        ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 2     ║ 6     ║ 0.40 ║ 1                        ║ 0.10         ║ 1          ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 2     ║ 7     ║ 0.40 ║ 1                        ║ 0            ║ 0          ║
╠═══════╬═══════╬══════╬══════════════════════════╬══════════════╬════════════╣
║ 2     ║ 9     ║ 0.40 ║ n/a                      ║ n/a          ║ n/a        ║
╚═══════╩═══════╩══════╩══════════════════════════╩══════════════╩════════════╝

【问题讨论】:

  • 为了确保其他人可以真正帮助您,请阅读how to make a reproducible example in R - 例如使用dput。您的表格看起来很花哨,但实际上对于复制到 R 环境和测试解决方案没有用。
  • 非常感谢@alex_jwb90 的评论。我相应地更新了问题!

标签: r


【解决方案1】:

要创建“更改”和“IV 中的稳定性”这两个列,请尝试以下操作,使用 dplyr

library(dplyr)
library(zoo)

df2 <- df %>%
  mutate(
    Group = na.locf(Group)
  ) %>%
  arrange(Group, Month) %>%
  group_by(Group) %>%
  mutate(
    tmp_continuous_block = cumsum(coalesce(Month - lag(Month) > 1, F))
  ) %>%
  group_by(Group, tmp_continuous_block) %>%
  mutate(
    Change = IV - lag(IV),
    `Previous Month Stability` = case_when(
      is.na(Change) ~ NA_integer_,
      T ~ lag(sequence(rle(IV)$lengths))
    ),
    `Stability in IV` = ifelse(Change == 0, 0L, `Previous Month Stability`)
  ) %>%
  ungroup() %>%
  select(-starts_with("tmp_"))

【讨论】:

  • 抱歉有些打嗝。在以与建议的by Mark over here 类似的方式使用rle 函数之后,这现在对我有用
  • 非常感谢您的指导。我在上面的示例中添加了另一列“Previous_month_stability”,它表示上个月-IV 的持续时间保持不变。我想知道如何修改以下部分! IV` 的稳定性 = case_when(is.na(Change) ~ NA_integer_, Change == 0 ~ 0L, T ~ lag(sequence(rle(IV)$lengths)
  • 我对这个专栏的理解,和Stability in IV是一样的,但是在稳定的几个月里不会归零,对吧?然后将Change == 0 ~ 0L, 留在外面。如果您在 Stability in IV 之前的 mutate 中创建它,您可以将该列创建为
  • 嗯,我把上面的反引号弄乱了。你会明白的,我想:)
  • 非常感谢!我从你身上学到了很多。对于 group_by(tmp_continuous_block),我添加了 Group--group_by(Group, tmp_continuous_block),这解决了我遇到的第二组没有计算“上个月稳定性”的问题!
猜你喜欢
  • 2012-08-27
  • 2016-01-18
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多