【问题标题】:Use tidyr::fill to fill missing values evenly above and below non-missing data使用 tidyr::fill 在非缺失数据上下均匀填充缺失值
【发布时间】:2021-06-09 16:45:23
【问题描述】:

我有一个涵盖 1945-2021 年的数据集和每十年的人口普查值(简化如下),我目前正在尝试使用 tidyr::fill 填充普查前后五年的每个人口普查值(例如,1991 年的人口普查应适用于 1986 - 1995 年)。但是,我的代码采用第一个人口普查值并向上和向下填充到下一个人口普查值,下一个人口普查值只会向下填充,依此类推。

dat_filled <- dat %>%
  fill(value, .direction = "downup")

原始数据

#>  year    value
#>  1945    <NA>
#>  1946    A
#>  1947    <NA>
#>  1948    <NA>
#>  1949    <NA>
#>  1950    <NA>
#>  1951    <NA>
#>  1952    <NA>
#>  1953    <NA>
#>  1954    <NA>
#>  1955    <NA>
#>  1956    B
#>  1957    <NA>
#>  1958    <NA>
#>  1959    <NA>
#>  1960    <NA>
#>  1961    <NA>
#>  1962    C
#>  1963    <NA>
#>  1964    <NA>

我目前得到的(第一个值 A,一直到 B 的第一次出现,然后 C 也是如此)

#>  year    value
#>  1945    A
#>  1946    A
#>  1947    A
#>  1948    A
#>  1949    A
#>  1950    A
#>  1951    A
#>  1952    A
#>  1953    A
#>  1954    A
#>  1955    A
#>  1956    B
#>  1957    B
#>  1958    B
#>  1959    B
#>  1960    B
#>  1961    B
#>  1962    C
#>  1963    C
#>  1964    C

我想要的(A 做一个“updown”,然后是 B,然后是 C,然后重复直到所有 NA 都被填满)

#>  year    value
#>  1945    A
#>  1946    A
#>  1947    A
#>  1948    A
#>  1949    A
#>  1950    A
#>  1951    A
#>  1952    B
#>  1953    B
#>  1954    B
#>  1955    B
#>  1956    B
#>  1957    B
#>  1958    B
#>  1959    B
#>  1960    C
#>  1961    C
#>  1962    C
#>  1963    C
#>  1964    C

我的实际数据比这稍微复杂一些,但这只是由于一个 group_by 函数。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    您可以这样做的一种方法是使用join

    df %>%
      filter(!is.na(value)) %>%
      mutate(year = map(year, ~seq(.x-5, .x+4)))%>%
      unnest(year) %>%
      right_join(df[1])
       year value
    1  1945     A
    2  1946     A
    3  1947     A
    4  1948     A
    5  1949     A
    6  1950     A
    7  1951     B
    8  1952     B
    9  1953     B
    10 1954     B
    11 1955     B
    12 1956     B
    13 1957     B
    14 1958     B
    15 1959     B
    16 1960     B
    17 1957     C
    18 1958     C
    19 1959     C
    20 1960     C
    21 1961     C
    22 1962     C
    23 1963     C
    24 1964     C
    

    【讨论】:

    • 非常直观的 Onyambu 先生!我真的很佩服你处理这个问题的方式。
    猜你喜欢
    • 2021-01-30
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2019-11-18
    • 2021-12-25
    相关资源
    最近更新 更多