【问题标题】:Determine missing values based on lagged grouped values根据滞后分组值确定缺失值
【发布时间】:2017-06-05 19:23:12
【问题描述】:

我需要根据先前和/或前向值、基于分组来填充缺失值。我想使用 dplyr 来完成此任务(尽管也欢迎使用 data.table 解决方案)。

样本数据:

testing <- tibble(key = c(10,10,10,10,10,10,20,20,20,20,20,20),
                  year = c(15,15,16,16,17,17,15,15,16,16,17,17),
                  name = c("abc","abc","","","dfg","dfg",
                          "","","nmm","nmm","",""),
                  is_name = c(1,1,0,0,1,1,0,0,0,0,0,0))

     key  year  name is_name
   <dbl> <dbl> <chr>   <dbl>
1     10    15   abc       1
2     10    15   abc       1
3     10    16             0
4     10    16             0
5     10    17   dfg       1
6     10    17   dfg       1
7     20    15             0
8     20    15             0
9     20    16   nmm       0
10    20    16   nmm       0
11    20    17             0
12    20    17             0

我想以某种方式填充缺失的名称 (name),如果相同 key 的前一个 year 标记为 is_name==1,则用它来填充缺失的名称。 所以输出可以是:

     key  year  name is_name name_new
   <dbl> <dbl> <chr>   <dbl>    <chr>
1     10    15   abc       1      abc
2     10    15   abc       1      abc
3     10    16             0      abc
4     10    16             0      abc
5     10    17   dfg       1      dfg
6     10    17   dfg       1      dfg
7     20    15             0         
8     20    15             0         
9     20    16   nmm       0      nmm
10    20    16   nmm       0      nmm
11    20    17             0         
12    20    17             0 

我尝试使用 lagleap,但它并没有正确地超出组 (key)。

谢谢!

【问题讨论】:

  • na.locf 来自 zoo-package 是您正在寻找的东西
  • @Jaap 我已经使用na.locf 准备了一个答案,然后看到了您的评论。我应该发布还是您打算发布自己的?

标签: r dplyr missing-data


【解决方案1】:

这可能对你有用

library(dplyr)
library(zoo)

testing <- testing %>%
           arrange(key, year) %>%
           mutate(name = ifelse(name == "", NA, name),
                  is_name = ifelse(is_name == 0, NA, is_name)) %>%
           group_by(key) %>%
           mutate(newname = ifelse((is.na(name) & na.locf(is_name, na.rm = FALSE) == 1), na.locf(name, na.rm = FALSE), name),
                  is_name = ifelse(is.na(is_name),0,is_name))

【讨论】:

  • 我需要的,我现在会在我的问题中编辑它,正是这样,但基于上一组的条件 - 即,只有 is_name==1 比我想要这样做.
  • 我更新了我的答案,进行了可能提供该功能的更改。
  • 谢谢。第 9 行和第 10 行现在是 NA,但它们应该带有值。
  • 我已经更新了答案,对我认为应该处理的新名称 mutate 进行了更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多