如何使用R的dplyr或tidyr按指定向量扩展数据框每行?
生成数据框与向量的所有组合解决方案
优先推荐:tidyr 解决方案
tidyr 提供了多个简洁的函数来生成笛卡尔积组合:
- 使用
expand_grid()(保留输入顺序)
library(tidyr) df1 <- data.frame(v = paste0('P', 1:3)) val <- c("cherry", "apple", "kiwi") # 生成所有组合,指定列名 df2 <- expand_grid(v = df1$v, fruit = val)
- 使用
crossing()(自动排序结果)crossing()和expand_grid()功能类似,但会自动对结果进行排序:
df2 <- crossing(v = df1$v, fruit = val)
dplyr + tidyr 组合方案
如果需要结合 dplyr 的管道操作,可以先给每行添加包含所有向量元素的列表列,再展开:
library(dplyr) library(tidyr) df2 <- df1 %>% mutate(fruit = list(val)) %>% # 给每行添加包含全部val的列表列 unnest(fruit) # 展开列表列生成所有组合
基础R备选方案
如果不想加载额外包,可以使用基础R的 expand.grid():
df2 <- expand.grid(v = df1$v, fruit = val, stringsAsFactors = FALSE)
内容的提问来源于stack exchange,提问作者user007
相关产品推荐
相关产品推荐

