dplyr - 检查月份是否存在,如果没有,请添加NA

时间:2018-03-29 15:41:41

标签: r dplyr

关闭但不重复:Proper idiom for adding zero count rows in tidyr/dplyr - 我尝试根据df中的现有值进行填充,但也会根据没有id的数据进行填充。相似,但根本不同。

对于每个id,我正在尝试确保每个帐单有3个帐单。

理想情况下,对于每个id,我需要required months中的所有三个df_complete。如果它不在数据中,我希望为值添加一行“未找到”。

此外,我想检查all_ids并添加all_ids中但df

中没有行的ID
months <- as.data.frame(as.Date(c("2016/7/1","2016/9/1","2016/7/1", "2016/8/1","2016/9/1", "2016/8/1","2016/9/1"))) 
id <- as.data.frame(c("a","a","b","b","b","c","c"))
value <- as.data.frame(c(1,2,3,4,5,6,7))
df <- cbind(id,months,value)
colnames(df) <- c("id","billing months","value")
required_months <- as.data.frame(as.Date(c("2016/7/1", "2016/8/1","2016/9/1")))
colnames(required_months)<- "required months"
all_ids <- as.data.frame(c("a","b", "c", "d"))

df最终看起来像:

id  billing months  value
a   7/1/2016    1
a   9/1/2016    2
b   7/1/2016    3
b   8/1/2016    4
b   9/1/2016    5
c   8/1/2016    6
c   9/1/2016    7

我在寻找什么(df_complete):

id  billing months  value
a   7/1/2016    1
a   8/1/2016    Not Found
a   9/1/2016    2
b   7/1/2016    3
b   8/1/2016    4
b   9/1/2016    5
c   7/1/2016    Not Found
c   8/1/2016    6
c   9/1/2016    7
d   7/1/2016    Not Found
d   8/1/2016    Not Found
d   9/1/2016    Not Found

寻找dplyr解决方案,但其他包也可以使用。

1 个答案:

答案 0 :(得分:4)

这看起来像tidyr::complete的工作。由于您在原始数据集中缺少id变量和月份,因此您需要通过complete定义所需的值。您可以使用fill定义输入缺失值的内容(尽管您的Not found值会将列从可能是一列数字的列更改为一列字符)。

suppressPackageStartupMessages( library(dplyr) )
library(tidyr)

df %>%
    complete(id = c("a","b", "c", "d"), 
             `billing months` = required_months$`required months`,
             fill = list(value = "Not found") )

#> Warning: Column `id` joining character vector and factor, coercing into
#> character vector

#> # A tibble: 12 x 3
#>    id    `billing months` value    
#>    <chr> <date>           <chr>    
#>  1 a     2016-07-01       1        
#>  2 a     2016-08-01       Not found
#>  3 a     2016-09-01       2        
#>  4 b     2016-07-01       3        
#>  5 b     2016-08-01       4        
#>  6 b     2016-09-01       5        
#>  7 c     2016-07-01       Not found
#>  8 c     2016-08-01       6        
#>  9 c     2016-09-01       7        
#> 10 d     2016-07-01       Not found
#> 11 d     2016-08-01       Not found
#> 12 d     2016-09-01       Not found

reprex package(v0.2.0)创建于2018-03-29。