R 按分组后联接表

R 按分组后联接表,r,left-join,dplyr,R,Left Join,Dplyr,我想在group_by操作之后对两个表执行联接 A <- data.frame(x1=c("a","b","c","d")) B <- data.frame(x1=c("a","c","d","c","a"), x2=c(1,1,1,2,2)) 但我想要的东西更像: x1 x2 a 1 a 2 b NA b NA c 1 c 2 d 1 d NA 所以我尝试了这个,但没有成功: B %>% dplyr::group_by(x2) %>% dplyr::lef

我想在group_by操作之后对两个表执行联接

A <- data.frame(x1=c("a","b","c","d"))
B <- data.frame(x1=c("a","c","d","c","a"), x2=c(1,1,1,2,2))
但我想要的东西更像:

x1 x2
a  1
a  2
b NA
b NA
c  1
c  2
d  1
d NA
所以我尝试了这个,但没有成功:

B %>% dplyr::group_by(x2) %>% dplyr::left_join(A,.data,by="x1")

如果可能的话,保持组_byx2对我来说真的很方便

这样做的一种方法是添加一个变量来计算x1的观察次数,然后用tidyr::complete完成data.frame

来源:本地数据帧[8 x 2]

##      x1    x2
##   (chr) (dbl)
## 1     a     1
## 2     a     2
## 3     b    NA
## 4     b    NA
## 5     c     1
## 6     c     2
## 7     d     1
## 8     d    NA

一种方法是添加一个计算x1观察次数的变量,然后使用tidyr::complete完成data.frame

来源:本地数据帧[8 x 2]

##      x1    x2
##   (chr) (dbl)
## 1     a     1
## 2     a     2
## 3     b    NA
## 4     b    NA
## 5     c     1
## 6     c     2
## 7     d     1
## 8     d    NA

我想我理解你想要达到的目标。首先,您希望通过x1连接两个数据集,然后根据唯一组的数量展开数据集。这里有一个可能的data.table解决方案


我想我理解你想要达到的目标。首先,您希望通过x1连接两个数据集,然后根据唯一组的数量展开数据集。这里有一个可能的data.table解决方案


对于您的想法,它可能是正确的,只是a mergeA,B,all=TRUE,但输出不适合您。像@DavidArenburg一样,我也不明白。只是关于分组方法的一点说明:为了加入,分组被忽略,但结果保留了x的分组。从帮助文件?left_join对于您的想法,它可能是正确的,只是a mergeA,B,all=TRUE,但输出不适合您的。像@DavidArenburg一样,我也不明白。只是关于分组方法的一点说明:为了加入,分组被忽略,但结果保留了x的分组。从帮助文件?left_joinI还检查了添加第三列值是否有效,是否有效。谢谢非常巧妙的解决方案!您好,我再次意识到,保留以下格式B%>%dplyr::group_byx2%>%dplyr::left_joinA、.data,by=x1对我来说非常方便。你能帮我吗?我还检查了添加第三列值是否有效,是否有效。谢谢非常巧妙的解决方案!您好,我再次意识到,保留以下格式B%>%dplyr::group_byx2%>%dplyr::left_joinA、.data,by=x1对我来说非常方便。你能帮我吗?
##      x1    x2
##   (chr) (dbl)
## 1     a     1
## 2     a     2
## 3     b    NA
## 4     b    NA
## 5     c     1
## 6     c     2
## 7     d     1
## 8     d    NA
library(data.table) # V 1.9.6+
# Store the number of unique ids in x2
GRPs <- uniqueN(B$x2) 
# First join by x1 and then expand according to number of unique groups in x2
setDT(B)[A, .SD[c(1:.N, rep(NA, GRPs - .N))], by = x1, on = "x1"] 
#    x1 x2
# 1:  a  1
# 2:  a  2
# 3:  b NA
# 4:  b NA
# 5:  c  1
# 6:  c  2
# 7:  d  1
# 8:  d NA
setDT(B)[A, if(.N < GRPs) c(x2, rep(NA, GRPs - .N)) else x2, by = x1, on = "x1"]
CJ(x1 = A$x1, x2 = B$x2, unique = TRUE)[!B, x2 := NA, on = c("x1", "x2")][]