所以我有两张桌子:
Table1:
ID Yr Qty Cum_Qty
A 2013 3 3
A 2015 3 6
A 2016 2 8
B 2006 1 1
Table2:
ID Yr
A 2013
A 2014
A 2015
A 2016
A 2017
B 2016
B 2017
C 2016
C 2017
这就是我想要实现的目标 - 我想将Cum_Qty添加到表2并继承最新的Cum_Qty(如果存在):
ID Yr Cum_Qty
A 2013 3
A 2014 3
A 2015 6
A 2016 8
A 2017 8
B 2016 1
B 2017 1
C 2016 0
C 2017 0
如果我目前执行left_join(table2, table1, by = c("ID", "Yr")
,如果表2中缺少特定年份,我最终会在Cum_Qty中使用NA值。
我考虑过使用滞后函数,但是这会让我在第一年的记录中使用NAs,并且不会对于表1中缺少的ID C起作用。
我想使用dplyr::mutate
所以我的代码保留在管道中。
我想我知道如何用3~4个变异做到这一点,但我想找到一种简化代码的方法。有没有人对我能做什么有任何建议?
在R中创建表:
table_1 <- data.frame(
ID = c("A", "A", "A", "B"),
Yr = c(2013, 2015, 2016, 2006),
Qty = c(3, 3, 2, 1)) %>%
arrange(ID, Yr) %>%
group_by(ID) %>%
mutate(Cum_Qty = cumsum(Qty))
table_2 <- data.frame(
ID = c("A", "A", "A", "A", "A", "B", "B", "C", "C"),
Yr = c(2013, 2014, 2015, 2016, 2017, 2016, 2017, 2016, 2017))
答案 0 :(得分:1)
鉴于您想要使用table_1中不存在于table_2中的某些数据,我认为您不能从left_join
开始。
您可以从full_join
开始,然后使用na.locf
包中的zoo
获取每个ID组的最后一个非NA值,然后再执行inner_join
最后的table_2中的行:
library(dplyr)
library(zoo)
full_join(table_2,table_1,by=c("ID","Yr")) %>%
group_by(ID) %>%
arrange(ID,Yr) %>%
mutate(Cum_Qty = na.locf(Cum_Qty,na.rm=F)) %>%
mutate(Cum_Qty = ifelse(is.na(Cum_Qty),0,Cum_Qty)) %>%
select(-Qty) %>%
inner_join(table_2)
# A tibble: 9 x 3
# Groups: ID [?]
ID Yr Cum_Qty
<chr> <dbl> <dbl>
1 A 2013 3
2 A 2014 3
3 A 2015 6
4 A 2016 8
5 A 2017 8
6 B 2016 1
7 B 2017 1
8 C 2016 0
9 C 2017 0