基本上,我希望列i
和j
列的所有独特组合;并且如果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)
答案 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
的所有组合