首页 > 解决方案 > 在 R 中编写组合

问题描述

我有一个像这样的数据框(df)

name  col1   col2
pippo A;B;C  E;F;G;
pluto G;H    X;Y;Z;E;O;D

我想写出 col1 的 1 个元素和 col 2 的 1 个元素之间的所有可能组合,并且每个组合都作为数据帧返回,例如

name     col1   col2
pippo      A       E
pippo      A       F
pippo      A       G
pippo      B       E
... and so on. 

考虑到我有所有字母并且 col1 和 col2 中的元素数量可以变化(从 1 个元素到 10 个),R 可以吗?

标签: rdataframecombinationsmultiple-columns

解决方案


我们可以crossing在拆分列后使用;

library(dplyr)
library(tidyr)
library(purrr)
df %>%
  transmute(name, new = map2(strsplit(col1, ";"),
         strsplit(col2, ";"), ~ crossing(col1 = .x, col2 = .y))) %>% 
  unnest(c(new))

-输出

# A tibble: 21 x 3
#   name  col1  col2 
#   <chr> <chr> <chr>
# 1 pippo A     E    
# 2 pippo A     F    
# 3 pippo A     G    
# 4 pippo B     E    
# 5 pippo B     F    
# 6 pippo B     G    
# 7 pippo C     E    
# 8 pippo C     F    
# 9 pippo C     G    
#10 pluto G     D    
# … with 11 more rows

数据

df <- structure(list(name = c("pippo", "pluto"), col1 = c("A;B;C", 
"G;H"), col2 = c("E;F;G;", "X;Y;Z;E;O;D")), class = "data.frame", 
row.names = c(NA, 
-2L))

推荐阅读