【问题标题】:How to repeat observations n times in R? [duplicate]如何在R中重复观察n次? [复制]
【发布时间】:2019-07-01 15:36:59
【问题描述】:

我正在努力将每个单位记录一次的变量合并到年度数据集中。虽然重复观察 n 次非常简单,但我很难为观察分配年份。

我的数据结构如下:

id startyear endyear dummy
1  1946      2005    1
2  1957      2005    1
3  1982      2005    1
4  1973      2005    1

我要做的是创建一个新行,称为years,它重复单元1 n = 2005 - 1946 = 59 次;单元 2 2005-1957 次,依此类推以及分配年份,生成以下输出:

id startyear endyear dummy year
1  1946      2005    1     1946
1  1946      2005    1     1947
1  1946      2005    1     1948
1  1946      2005    1     1949
[…]

我曾尝试在 dplyr 中使用 slicemutate,与 repseq 结合使用,但两者都没有给我想要的结果。任何帮助将不胜感激。

【问题讨论】:

    标签: r dplyr repeat


    【解决方案1】:

    我们可以使用map2 为每个元素创建一个从“startyear”到“endyear”的序列,然后将其转换为list 然后unnest

    library(tidyverse)
    df1 %>% 
        mutate(year = map2(startyear, endyear, `:`)) %>%
        unnest
    # id startyear endyear dummy year
    #1    1      1946    2005     1 1946
    #2    1      1946    2005     1 1947
    #3    1      1946    2005     1 1948
    #4    1      1946    2005     1 1949
    #5    1      1946    2005     1 1950
    #6    1      1946    2005     1 1951
    #7    1      1946    2005     1 1952
    #...
    

    或者按“id”、mutate 分组为listunnest

    df1 %>% 
      group_by(id) %>% 
      mutate(year = list(startyear:endyear)) %>% 
      unnest
    

    【讨论】:

    • 创意,比我考虑的炮制merge/*_join好一点。
    • 后一种方法效果很好,谢谢!但是,我收到多个警告说In startyear:endyear : numerical expression has 2 elements: only the first used。有什么办法可以解决这个问题?
    • @VLarsen 对于您发布的示例,我没有收到任何警告。你能再举一个例子吗
    【解决方案2】:

    不太优雅的替代方案,几乎一样简单:

    library(tidyverse)
    df1 %>% 
        uncount(endyear - startyear + 1, .id = "row") %>%
        mutate(year = startyear + row - 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2021-05-03
      • 2013-10-12
      • 2018-07-01
      相关资源
      最近更新 更多