【发布时间】:2019-03-05 14:45:58
【问题描述】:
考虑这两个数据框:
t1<-data.frame(Time=1:3,Cat=rep("A",3),SomeValue=rep("t1",3))
t2<-data.frame(Time=c(1,2,3,1,3),Cat=rep("A",5),Id=c(1,1,1,2,2),SomeOtherValue=c(1,2,3,4,5))
在我的应用程序中,我需要进行完全联接并处理缺失的记录/值。对子集(分组变量)进行部分 full_join 是可行的,但是当我尝试未过滤的方法时会丢失我的缺失值。
这将给我 6 条记录
t2 %>% group_by(Id) %>% filter(Id==2) %>% full_join(t1,by=c("Time","Cat"))
t2 %>% group_by(Id) %>% filter(Id==1) %>% full_join(t1,by=c("Time","Cat"))
这将给我 5,其中 Id==2 和 Time==2 的缺失条目(NA 值)消失了:
t2 %>% group_by(Id) %>% full_join(t1,by=c("Time","Cat"))
我对 group_by 的理解是它按变量分组,并继续我在每个组上的所有后续突变、映射等。它应该以这种方式表现吗?
【问题讨论】:
-
group_by不是问题。您有 5 行,因为您基于Time和Cat加入。你可以看到t2 %>% group_by(Id) %>% full_join(t1,by=c("Time","Cat"))和t2 %>% full_join(t1,by=c("Time","Cat"))给出相同的结果 -
在
t2 %>% group_by(Id) %>% filter(Id==2) %>% full_join(t1,by=c("Time","Cat"))中,你得到了缺失值,因为在使用filter之后,你实际上对t1进行了子集化,这导致了一个完全不同的数据框 -
我不明白这个。您能否详细说明我已对 't1' 进行子集化的陈述的含义。如果我在 SQL 中做同样的事情,我会得到 6 条记录。
-
t2 %>% group_by(Id) %>% filter(Id==2)或t2 %>% group_by(Id) %>% filter(Id==1)和t1是不同的。你不应该期望在完整之后有相同的输出)加入他们t2 -
我在什么时候对 t1 进行了子集化?我通过过滤明确地对 t2 进行了子集化。我要说的是两个连接(即两个输出)的并集不构成未过滤的连接。我期待着。确实它们是不同的,这就是重点。我需要 t1 的所有东西和 t2 的所有东西。 full_join:返回 x 和 y 的所有行和所有列。如果没有匹配的值,则为缺失的值返回 NA。