有人知道tidyr::complete()
是否支持通过group_by()
进行分组吗?
准确地说:我有一些看起来像这样的数据框
df <- data.frame(
"ID" = rep(1:2, each = 2),
"Col1" = c("A", NA, "AA", NA),
"Col2" = c("B", "C", "BB", "CC"))
现在我想使用complete()
和group_by()
计算所有可能的组合每组!
df %>%
group_by(ID) %>%
complete(Col1, Col2)
Error in .Call("dplyr_left_join_impl", PACKAGE = "dplyr", x, y, by_x, :
negative length vectors are not allowed
这会导致错误。但是,在没有分组的情况下使用complete()
可以使用,但这不是我想要的。
df %>%
complete(Col1, Col2)
问题:
complete()
根本不适用于group_by
?答案 0 :(得分:5)
您可以使用complete
和group_by
执行此操作,但必须使用do
语句:
df %>%
group_by(ID) %>%
do(complete(., Col1, Col2, fill = list(ID = .$ID)))
答案 1 :(得分:2)
我们可以使用data.table
执行此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)
)和交叉加入(CJ
)&#39; Col1&#39;的unique
元素和&#39; Col2&#39;,按ID&#39;分组。
library(data.table)#v1.9.6+
setDT(df)[,CJ(Col1, Col2, unique=TRUE), by = ID]
# ID V1 V2
#1: 1 NA B
#2: 1 NA C
#3: 1 A B
#4: 1 A C
#5: 2 NA BB
#6: 2 NA CC
#7: 2 AA BB
#8: 2 AA CC
答案 2 :(得分:1)
只是想让所有人都知道,tidyr
的开发版本(截至2016年1月13日的版本0.3.1.9000)所有tidyr
动词现在都尊重分组,因此使用dplyr::do
进行解决方法没有必要了。一旦版本可以在CRAN上使用,我将编辑我的答案。