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)