【问题标题】:Create a "time period" index variable based on year R根据 R 年创建“时间段”索引变量
【发布时间】:2021-10-26 15:25:45
【问题描述】:

我希望构造一个变量,为每个 ID/年份组合分配一个 ID 值,以便新变量计算时间段,而不是简单地列出年份。

这就是我想要的:

id year time_period
1 2001 1
1 2002 2
1 2004 3
2 2005 1
2 2006 2
3 2002 1
3 2005 2
4 2004 1
4 2008 2
4 2009 3
4 2011 4
structure(list(id = c(1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4), year = c(2001, 
2002, 2004, 2005, 2006, 2002, 2005, 2004, 2008, 2009, 2011), 
    time_period = c(1, 2, 3, 1, 2, 1, 2, 1, 2, 3, 4)), class = "data.frame", row.names = c(NA, 
-11L))

我该怎么做?我更喜欢 tidyverse 解决方案,但最简单的就足够了。

更新:我尝试了以下方法:

df %>% group_by(ID, year) %>% mutate(time_period = sequence(n()))

但这并没有产生预期的结果。

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    解决方案是只按id分组,然后创建序列,如果你可以把年份变成factor,然后转换成整数/数字:

    df %>% 
       group_by(id) %>% 
       mutate(time_period_factor = as.integer(factor(year, levels = sort(unique(year)))))
    
    # A tibble: 12 x 4
    # Groups:   id [4]
    #      id  year time_period time_period_factor
    #   <dbl> <dbl>       <dbl>              <int>
    # 1     1  2001           1                  1
    # 2     1  2002           2                  2
    # 3     1  2004           3                  3
    # 4     2  2005           1                  1
    # 5     2  2006           2                  2
    # 6     3  2002           1                  1
    # 7     3  2005           2                  2
    # 8     4  2004           1                  1
    # 9     4  2008           2                  2
    #10     4  2009           3                  3
    #11     4  2011           4                  4
    #12     4  2009           3                  3
    

    一个站点具有重复年份的新数据

    df <- structure(list(id = c(1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4,4), year = c(2001, 
                                                                     2002, 2004, 2005, 2006, 2002, 2005, 2004, 2008, 2009, 2011,2009), 
                   time_period = c(1, 2, 3, 1, 2, 1, 2, 1, 2, 3, 4,3)), class = "data.frame", row.names = c(NA, 
                                                                                                          -12L))
    

    【讨论】:

    • 这似乎不适用于我的完整数据集。我创建了一个“假”数据集作为示例,代码对此工作正常,但它创建了time_period_rank 值,例如 1.5 和 4.5。关于可能导致这种情况的任何想法?我无法共享完整的数据集。我更改了 ties.method 参数,但仍然没有得到正确的结果
    • 1.5 和 4.5 是由于排名的关系,也就是说,每个(某些)站点都有重复的年份。您可以更改rank 处理与ties.method 的关系的方式。
    • 是的,我尝试更改 ties.method,但我的 id 仍然得到不正确的结果。我有一个例子,对于相同的 id,time_period_rank 是 1 表示 2002 年,2 表示 2004 年的两个观察值,但 4 表示 2006 年的一个。但是,2006 年的一个应该是 3,而不是 4。
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多