R 分组依据()和汇总()以及所有组合(包括不存在的组合)

R 分组依据()和汇总()以及所有组合(包括不存在的组合),r,dplyr,tidyr,tidyverse,R,Dplyr,Tidyr,Tidyverse,基本上,我想拥有列I和j的所有唯一组合;如果不可用,则应在列k中使用NA(类似于按和汇总进行分组,但使用所有唯一的可能组合) 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 &a

基本上,我想拥有列
I
j
的所有唯一组合;如果不可用,则应在列
k
中使用
NA
(类似于按
汇总
进行分组,但使用所有唯一的可能组合)

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)
库(tidyverse)
df%
价差(j,k)%>%
聚集(j,k,-i)

似乎
交叉连接()
仍然是一个,
扩展.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"))
因此,OP使用
spread()
gather()
的方法似乎更简洁

就个人而言,我确实更喜欢
data.table
包中的
CJ()
函数:

library(data.table)
setDT(df)[CJ(i = i, j = j, unique = TRUE), on = .(i, j)]
CJ()
可以与
右连接()一起用作
扩展.grid()
的替代品:


您可以从
tidyverse

这将提供列i和j的所有组合

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
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
df %>% complete(i,j)