fruits %>% expand(type)
#> # A tibble: 2 x 1
#> type
#> <chr>
#> 1 apple
#> 2 orange
fruits %>% expand(type, size)
#> # A tibble: 8 x 2
#> type size
#> <chr> <fct>
#> 1 apple XS
#> 2 apple S
#> 3 apple M
#> 4 apple L
#> 5 orange XS
#> 6 orange S
#> 7 orange M
#> 8 orange L
b<-fruits %>% expand(type, size, year)
#> # A tibble: 16 x 3
#> type size year
#> <chr> <fct> <dbl>
#> 1 apple XS 2010
#> 2 apple XS 2012
#> 3 apple S 2010
#> 4 apple S 2012
#> 5 apple M 2010
#> 6 apple M 2012
#> 7 apple L 2010
#> 8 apple L 2012
#> 9 orange XS 2010
#> 10 orange XS 2012
#> 11 orange S 2010
#> 12 orange S 2012
#> 13 orange M 2010
#> 14 orange M 2012
#> 15 orange L 2010
#> 16 orange L 2012
9条答案
按热度按时间piok6c0g1#
你可以使用这个,但可能有一个更简单的解决方案:
expand.grid
返回一个data.frame
,当它与apply
一起使用时,apply
会将其转换为matrix
。这是不必要的(并且在大数据上效率低下)。outer
给出一个matrix
,并且也接受函数参数。它在大数据上也会非常有效。使用
outer
:u4vypkhs2#
另一种选择是使用
rep
的each
参数:我发现这比基于
apply
或expand.grid
的解决方案更简单。8ehkhllq3#
另一个使用
sprintf
和expand.grid
的选项:其给出:
说明:
expand.grid
可以创建两个向量的所有组合。sprintf
根据指定的格式('%s.%s'
)将两个向量粘贴在一起。格式的每个%s
部分都被向量的元素替换。vh0rcniy4#
这个老问题已经有了一个公认的答案。但是由于它被用作欺骗目标,我相信添加一个
data.table
解决方案是值得的,它使用了 cross join 函数CJ()
:如果原始订单很重要:
编辑:
CJ()
在1.12.0版本中更改了默认行为正如1.12.0版本的发行说明中所宣布的那样(第3点),默认选项
options(datatable.CJ.names=TRUE)
已经更改。CJ()
现在自动命名其输入,与as data.table()
完全相同。因此,上述代码必须针对
data.table
版本1.12.0及更高版本进行修改:和
分别
k3bvogb15#
要保持问题中请求的字符串的顺序,您可以使用这两种方法的以下两个修改:
改变向量的顺序并以相反的顺序合并
或在转换为向量之前转置矩阵:
jaxagkaj6#
purrr
的其他选项:我们也可以使用
cross2
polhcujo7#
从该link复制带有dplyr的选项
所有可能的组合,即所有都被定义,但不一定存在于数据中
然后简单的粘贴
0wi1tuuw8#
下面是使用基本
R
的另一个选项brvekthn9#
最简单的解决方法就是