【问题标题】:Is there a way to create NA conditionally on a row? R有没有办法连续有条件地创建 NA ? R
【发布时间】:2021-04-01 04:06:19
【问题描述】:

我有这个虚拟数据集,我想根据行有条件地转换一列。

这是数据集。

> dput(df)
structure(list(year = c(2012, 2013, 2014, 2015, 2016, 2017, 2018, 
2019, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2012, 2013, 
2014, 2015, 2016, 2017, 2018, 2019, 2012, 2013, 2014, 2015, 2016, 
2017, 2018, 2019, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 
2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2012, 2013, 2014, 
2015, 2016, 2017, 2018, 2019), id = c(1, 1, 1, 1, 1, 1, 1, 1, 
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 
4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 
7, 7, 7, 7, 7, 7), apv = c("Y", "Y", "Y", "Y", "Y", "Y", "Y", 
"Y", "Y", "Y", "Y", "NA", "NA", "NA", "NA", "NA", "Y", "Y", "Y", 
"Y", "Y", "N", "NA", "NA", "Y", "Y", "Y", "Y", "Y", "N", "N", 
"N", "Y", "Y", "Y", "N", "N", "N", "NA", "NA", "Y", "Y", "Y", 
"Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "N", "N", "N", "Y", "Y"
), apv_d = c("Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", 
"Y", "N", "NA", "NA", "NA", "NA", "Y", "Y", "Y", "Y", "Y", "N", 
"NA", "NA", "Y", "Y", "Y", "Y", "Y", "N", "NA", "NA", "Y", "Y", 
"Y", "N", "NA", "NA", "NA", "NA", "Y", "Y", "Y", "Y", "Y", "Y", 
"N", "Y", "Y", "Y", "Y", "N", "NA", "NA", "Y", "Y")), row.names = c(NA, 
-56L), class = c("tbl_df", "tbl", "data.frame"))

所以这是我的数据集,我只有变量 apv,我想将所述列转换为 apv_d

我认为我应该使用带有 match 参数的函数,但我真的很迷茫,因为我以前从未做过函数。


编辑:变量apv 告诉我们公司在每个时期是开放还是关闭。 所以我只想让公司第一次关闭,如果公司从面板中消失(id=2 的情况),我希望apvis N 表示公司的第一次关闭。如果apv 关闭超过一个时期(case id=4)我想生成 NAs

如果apv 是 Y 就保持这样,但如果有 N 次(对于相同的 id),则只保留第一个,其他的都是 NA。

但考虑到 id=2 的情况,第一个周期是 NA,我希望它是 N,其余的 NA


Edit2:由于示例数据的答案很好,但我对真实数据有一​​些问题,这里是真实数据:real data here

完整数据集中的问题如下所示:

其中 año=year, ruc=id, nombre 是一个无意义的变量。

提前致谢

【问题讨论】:

    标签: r database function dataframe dplyr


    【解决方案1】:
      df %>%
        group_by(id) %>%
        mutate(closure = cumsum(lag(apv) == "Y" & apv != "Y"),
               apv_d2  = case_when(apv == "Y" ~ "Y",
                                   closure == 0 ~ apv,
                                   closure == 1 & lag(closure) == 0 ~ "N",
                                   TRUE ~ "NA"))
    

    结果

       year id apv apv_d closure apv_d2
    1  2012  1   Y     Y       0      Y
    2  2013  1   Y     Y       0      Y
    3  2014  1   Y     Y       0      Y
    4  2015  1   Y     Y       0      Y
    5  2016  1   Y     Y       0      Y
    6  2017  1   Y     Y       0      Y
    7  2018  1   Y     Y       0      Y
    8  2019  1   Y     Y       0      Y
    9  2012  2   Y     Y       0      Y
    10 2013  2   Y     Y       0      Y
    11 2014  2   Y     Y       0      Y
    12 2015  2  NA     N       1      N
    13 2016  2  NA    NA       1     NA
    14 2017  2  NA    NA       1     NA
    15 2018  2  NA    NA       1     NA
    16 2019  2  NA    NA       1     NA
    17 2012  3   Y     Y       0      Y
    18 2013  3   Y     Y       0      Y
    19 2014  3   Y     Y       0      Y
    20 2015  3   Y     Y       0      Y
    21 2016  3   Y     Y       0      Y
    22 2017  3   N     N       1      N
    23 2018  3  NA    NA       1     NA
    24 2019  3  NA    NA       1     NA
    25 2012  4   Y     Y       0      Y
    26 2013  4   Y     Y       0      Y
    27 2014  4   Y     Y       0      Y
    28 2015  4   Y     Y       0      Y
    29 2016  4   Y     Y       0      Y
    30 2017  4   N     N       1      N
    31 2018  4   N    NA       1     NA
    32 2019  4   N    NA       1     NA
    33 2012  5   Y     Y       0      Y
    34 2013  5   Y     Y       0      Y
    35 2014  5   Y     Y       0      Y
    36 2015  5   N     N       1      N
    37 2016  5   N    NA       1     NA
    38 2017  5   N    NA       1     NA
    39 2018  5  NA    NA       1     NA
    40 2019  5  NA    NA       1     NA
    41 2012  6   Y     Y       0      Y
    42 2013  6   Y     Y       0      Y
    43 2014  6   Y     Y       0      Y
    44 2015  6   Y     Y       0      Y
    45 2016  6   Y     Y       0      Y
    46 2017  6   Y     Y       0      Y
    47 2018  6   N     N       1      N
    48 2019  6   Y     Y       1      Y
    49 2012  7   Y     Y       0      Y
    50 2013  7   Y     Y       0      Y
    51 2014  7   Y     Y       0      Y
    52 2015  7   N     N       1      N
    53 2016  7   N    NA       1     NA
    54 2017  7   N    NA       1     NA
    55 2018  7   Y     Y       1      Y
    56 2019  7   Y     Y       1      Y
    

    【讨论】:

      【解决方案2】:

      您可以使用一个小的辅助函数并将其应用于每个id

      generate_result <- function(apv) {
        inds <- apv == 'N' | apv == 'NA'
        apv[inds & !duplicated(inds)] <- 'N'
        apv[inds & duplicated(inds)] <- 'NA'
        apv
      }
      
      library(dplyr)
      df %>% group_by(id) %>% mutate(apv_res = generate_result(apv)) %>% ungroup
      

      这会返回 -

         year id apv apv_d apv_res
      1  2012  1   Y     Y       Y
      2  2013  1   Y     Y       Y
      3  2014  1   Y     Y       Y
      4  2015  1   Y     Y       Y
      5  2016  1   Y     Y       Y
      6  2017  1   Y     Y       Y
      7  2018  1   Y     Y       Y
      8  2019  1   Y     Y       Y
      9  2012  2   Y     Y       Y
      10 2013  2   Y     Y       Y
      11 2014  2   Y     Y       Y
      12 2015  2  NA     N       N
      13 2016  2  NA    NA      NA
      14 2017  2  NA    NA      NA
      15 2018  2  NA    NA      NA
      16 2019  2  NA    NA      NA
      17 2012  3   Y     Y       Y
      18 2013  3   Y     Y       Y
      19 2014  3   Y     Y       Y
      20 2015  3   Y     Y       Y
      21 2016  3   Y     Y       Y
      22 2017  3   N     N       N
      23 2018  3  NA    NA      NA
      24 2019  3  NA    NA      NA
      25 2012  4   Y     Y       Y
      26 2013  4   Y     Y       Y
      27 2014  4   Y     Y       Y
      28 2015  4   Y     Y       Y
      29 2016  4   Y     Y       Y
      30 2017  4   N     N       N
      31 2018  4   N    NA      NA
      32 2019  4   N    NA      NA
      33 2012  5   Y     Y       Y
      34 2013  5   Y     Y       Y
      35 2014  5   Y     Y       Y
      36 2015  5   N     N       N
      37 2016  5   N    NA      NA
      38 2017  5   N    NA      NA
      39 2018  5  NA    NA      NA
      40 2019  5  NA    NA      NA
      41 2012  6   Y     Y       Y
      42 2013  6   Y     Y       Y
      43 2014  6   Y     Y       Y
      44 2015  6   Y     Y       Y
      45 2016  6   Y     Y       Y
      46 2017  6   Y     Y       Y
      47 2018  6   N     N       N
      48 2019  6   Y     Y       Y
      49 2012  7   Y     Y       Y
      50 2013  7   Y     Y       Y
      51 2014  7   Y     Y       Y
      52 2015  7   N     N       N
      53 2016  7   N    NA      NA
      54 2017  7   N    NA      NA
      55 2018  7   Y     Y       Y
      56 2019  7   Y     Y       Y
      

      【讨论】:

      • 感谢 Ronak,它确实对示例数据有效。但是在实际数据中,只要我遇到 id=2 不会生成第一个闭包的 N 的情况。我给你发了真实的数据。我想把它放在这里,让乔恩也能看到它,但它太广泛了。
      • 是的,同意。但正是 id=2 的情况。
      • 哦,是的!我认为这是一个缺失值是可以理解的,因为这是常见的 R 符号。我应该如何输入这些值?
      • 好吧,对不起。不会再发生了。
      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多