tidyr::expand_grid()运行结果不符合预期,问题出在哪里?
问题原因
tidyr::expand_grid()的参数处理逻辑是:将每个传入的独立参数作为一个维度,计算多个维度之间的笛卡尔积。
你现在的写法是expand_grid(a),仅传入了单个tibble对象作为唯一参数,函数会把整个tibble视为一个独立维度,不会自动拆分tibble内部的列作为多个独立维度处理,所以最终输出就是原tibble本身,不会计算列之间的笛卡尔积。
而你使用cross_df()的代码是先把tibble转为列表,相当于把b、c两列拆成了两个独立的向量元素传入cross_df(),函数会对这两个独立元素计算笛卡尔积,因此得到了你期望的4行结果。
正确实现方式
如果要使用expand_grid()得到相同的结果,有两种常用写法:
- 显式传入每一列作为独立参数:
expand_grid(b = unique(a$b), c = unique(a$c))
- 用
!!!操作符将转成列表的tibble炸开为多个独立参数传入:
library(purrr) expand_grid(!!!as.list(a) %>% map(unique))
两种写法的输出都和你用cross_df()得到的结果一致。
内容的提问来源于stack exchange,提问作者Mike Lawrence
相关产品推荐
相关产品推荐

