【问题标题】:R group_by %>% full_join losing NA recordsR group_by %>% full_join 丢失 NA 记录
【发布时间】: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 行,因为您基于 TimeCat 加入。你可以看到t2 %&gt;% group_by(Id) %&gt;% full_join(t1,by=c("Time","Cat"))t2 %&gt;% full_join(t1,by=c("Time","Cat")) 给出相同的结果
  • t2 %&gt;% group_by(Id) %&gt;% filter(Id==2) %&gt;% full_join(t1,by=c("Time","Cat")) 中,你得到了缺失值,因为在使用filter 之后,你实际上对t1 进行了子集化,这导致了一个完全不同的数据框
  • 我不明白这个。您能否详细说明我已对 't1' 进行子集化的陈述的含义。如果我在 SQL 中做同样的事情,我会得到 6 条记录。
  • t2 %&gt;% group_by(Id) %&gt;% filter(Id==2)t2 %&gt;% group_by(Id) %&gt;% filter(Id==1)t1 是不同的。你不应该期望在完整之后有相同的输出)加入他们t2
  • 我在什么时候对 t1 进行了子集化?我通过过滤明确地对 t2 进行了子集化。我要说的是两个连接(即两个输出)的并集不构成未过滤的连接。我期待着。确实它们是不同的,这就是重点。我需要 t1 的所有东西和 t2 的所有东西。 full_join:返回 x 和 y 的所有行和所有列。如果没有匹配的值,则为缺失的值返回 NA。

标签: r dplyr


【解决方案1】:

在正确阅读文档后,我终于找到了说明出于加入目的而忽略组的部分。 ?full_join

【讨论】:

  • 干得好!在我在这里发帖后一直发生在我身上——我在世界其他地方之前疯狂地争先恐后地寻找答案。
猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
相关资源
最近更新 更多