【问题标题】:Run ifelse x times with one call (quasi iteratively until condition is fulfilled)一次调用运行 ifelse x 次(准迭代直到满足条件)
【发布时间】:2022-01-13 17:13:50
【问题描述】:

这个问题和这个Is there an R function for imputing missing year values, consecutively, by group?有关:

OP 要求此数据框按组估算缺失的年份值:(已经有足够的答案)

df <- data.frame(ID=c("A", "A", "A", "A", 
                      "B", "B", "B", "B",
                      "C", "C", "C", "C",
                      "D", "D", "D", "D"),
                 grade=c("KG", "01", "02", "03",
                         "KG", "01", "02", "03",
                         "KG", "01", "02", "03",
                         "KG", "01", "02", "03"),
                 year=c(2002, 2003, NA, 2005,
                        2007, NA, NA, 2010,
                        NA, 2005, 2006, NA,
                        2009, 2010, NA, NA))

我尝试将ifelselag()lead() 一起使用:

文字中的想法: 如果该行是 NA 则取上面的行并加 1。 如果组中只有一个 NA 行,则此方法可以正常工作。 如果有 2 个连续的 NA,那么它就会变得笨拙。

我的问题是我怎样才能让ifelse 一次调用就运行,直到所有 NA 都被替换:

我的尝试:

library(dplyr)
df %>% 
  group_by(ID) %>% 
  mutate(year= ifelse(is.na(year), lag(year)+1, year),
         year= ifelse(is.na(year), lag(year)+1, year),
         year= ifelse(is.na(year), lead(year)-1, year))

给予:

   ID    grade  year
   <chr> <chr> <dbl>
 1 A     KG     2002
 2 A     01     2003
 3 A     02     2004
 4 A     03     2005
 5 B     KG     2007
 6 B     01     2008
 7 B     02     2009
 8 B     03     2010
 9 C     KG     2004
10 C     01     2005
11 C     02     2006
12 C     03     2007
13 D     KG     2009
14 D     01     2010
15 D     02     2011
16 D     03     2012

【问题讨论】:

  • 您标记了 dplyr 但在基数中,如果 x 是您的年份向量 Reduce(function(acc,cv) if(is.na(cv)) acc + 1 else cv,x, accumulate =T)
  • @SmokeyShakers 这是非常好的 SmokeyShakers。请提供答案!

标签: r if-statement dplyr


【解决方案1】:

我们可以使用purrr中的accumulate

library(dplyr)
library(purrr)
df %>% 
   group_by(ID) %>% 
   mutate(year = accumulate(accumulate(year, 
      ~ if(is.na(.y)) .x + 1 else .y),
       ~ if(is.na(.x)) .y - 1 else .x, .dir = "backward")) %>% 
   ungroup

-输出

# A tibble: 16 × 3
   ID    grade  year
   <chr> <chr> <dbl>
 1 A     KG     2002
 2 A     01     2003
 3 A     02     2004
 4 A     03     2005
 5 B     KG     2007
 6 B     01     2008
 7 B     02     2009
 8 B     03     2010
 9 C     KG     2004
10 C     01     2005
11 C     02     2006
12 C     03     2007
13 D     KG     2009
14 D     01     2010
15 D     02     2011
16 D     03     2012

【讨论】:

  • 完美大师!
猜你喜欢
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多