group_by()和summary()包含所有组合(包括不存在的组合)

时间:2017-08-23 06:25:48

标签: r dplyr tidyr tidyverse

基本上,我希望列ij列的所有独特组合;并且如果NA列不可用,则期待k {类似于group_by& summarise,但具有所有唯一可能的组合。

tidyverse是否有任何现有的功能,或者与我在下面写的那个功能相同?

library(tidyverse)

df <- tibble(
 i = c("a", "a", "b"),
 j = c("x", "y", "x"),
 k = c(100, 300, 20)
)

# I often write this chunk below after group_by & summarise
df %>%
  spread(j, k) %>%
  gather(j, k, -i)

2 个答案:

答案 0 :(得分:3)

由于似乎cross_join()仍然是tidyverse feature request on github,因此需要使用expand.grid(unique(df$i), unique(df$j), stringsAsFactors = FALSE)来创建具有所有唯一可能组合的data.frame:

df %>% 
  right_join(expand.grid(unique(df$i), unique(df$j), stringsAsFactors = FALSE), 
           by = c("i" = "Var1", "j" = "Var2"))
  i j   k
1 a x 100
2 b x  20
3 a y 300
4 b y  NA

因此,OP使用spread()gather()的方法似乎更简洁。

就个人而言,我更喜欢CJ()包中的data.table功能:

library(data.table)
setDT(df)[CJ(i = i, j = j, unique = TRUE), on = .(i, j)]
   i j   k
1: a x 100
2: a y 300
3: b x  20
4: b y  NA

CJ()可与expand.grid()一起替代right_join()

df %>% 
  right_join(data.table::CJ(i = .$i, j = .$j, unique = TRUE))
  i j   k
1 a x 100
2 a y 300
3 b x  20
4 b y  NA

答案 1 :(得分:3)

您可以使用complete中的tidyverse功能 http://tidyr.tidyverse.org/reference/complete.html

df %>% complete(i,j)

这为您提供了列i和j

的所有组合