【问题标题】:Listing ALL combinations of Factors列出所有因素组合
【发布时间】:2021-12-28 20:20:40
【问题描述】:

给定以下数据框:

data_frame = data.frame(food = c("pizza", "tacos", "nachos"), drinks = c("water", "coffee", "pop"))

 data_frame
    food drinks
1  pizza  water
2  tacos coffee
3 nachos    pop

有没有办法列出这些因素的所有组合?

例如:

food_combinations = c("none", pizza", "tacos", "nachos", "pizza & tacos", "pizza & nachos", "tacos & nachos", "pizza & tacos & nachos")

drink_combinations = c("none", coffee", "pop", "water", "coffee & pop", "coffee & water", "pop & water", "coffee & pop & water")

谢谢!

【问题讨论】:

标签: r combinations categories factors


【解决方案1】:

我们可以使用combn 来做 - 用lapply 循环列,然后在元素序列上做一个嵌套循环,应用combnpaste

lst1 <- lapply(data_frame, \(x) c("none", unlist(lapply(seq_len(length(x)),
        \(i) combn(x, i, FUN = paste, collapse = " & ")))))

-输出

> lst1
$food
[1] "none"                   "pizza"                  "tacos"                  "nachos"                 "pizza & tacos"          "pizza & nachos"        
[7] "tacos & nachos"         "pizza & tacos & nachos"

$drinks
[1] "none"                 "water"                "coffee"               "pop"                  "water & coffee"       "water & pop"          "coffee & pop"        
[8] "water & coffee & pop"

【讨论】:

  • @Akrun:非常感谢您的回答!我尝试运行您的答案并收到以下错误
  • lst1
  • 错误:“lst1 (i) combn(x, i, FUN = paste, collapse = " & ")))) 中出现意外输入错误:意外输入“
  • 你能告诉我我做错了什么吗?谢谢!
  • 为清楚起见,它是 R 版本 &lt; 4.1。在 R-4.1.0 中添加了 \(x) 符号(请参阅 cran.r-project.org/doc/manuals/r-release/NEWS.html)。
【解决方案2】:

-编辑:采用@akrun 的响应,因为它更简洁且不依赖任何包

这是另一种方法,以函数的形式。参数m 允许您选择每个短语中的最大元素。

df <- data.frame(
  food = c("pizza", "tacos", "nachos"),
  drinks = c("water", "coffee", "pop")
)

comb1 <- function(vector, m = length(vector)) {
    if (m >= length(vector)) {
      data <- unlist(lapply(seq_len(length(df$food)),
                            \(i) combn(df$food, i, paste, collapse = ' & ')))
    }
    else {
      data <- unlist(lapply(seq_len(m),
                            \(i) combn(df$food, i, paste, collapse = ' & ')))
    }
    return(data)
  }

哪个渲染

> comb1(df$food)

[1] "none"                   "nachos"                 "pizza"                 
[4] "tacos"                  "nachos & pizza"         "nachos & tacos"        
[7] "pizza & tacos"          "nachos & pizza & tacos"

> comb1(df$food,2)

[1] "none"           "nachos"         "pizza"          "tacos"          "nachos & pizza"
[6] "nachos & tacos" "pizza & tacos" 

对于数据框上的列表,只需 lapply

> lapply(df, comb1)

$food
[1] "none"                   "nachos"                 "pizza"                 
[4] "tacos"                  "nachos & pizza"         "nachos & tacos"        
[7] "pizza & tacos"          "nachos & pizza & tacos"

$drinks
[1] "none"                 "coffee"               "pop"                 
[4] "water"                "coffee & pop"         "coffee & water"      
[7] "pop & water"          "coffee & pop & water"

> lapply(df, \(x) comb1(x,2))

$food
[1] "none"           "nachos"         "pizza"          "tacos"          "nachos & pizza"
[6] "nachos & tacos" "pizza & tacos" 

$drinks
[1] "none"           "coffee"         "pop"            "water"          "coffee & pop"  
[6] "coffee & water" "pop & water"  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多