R 按分组后联接表
我想在group_by操作之后对两个表执行联接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
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")][]