【问题标题】:Producing all combinations of two column values in R在R中产生两列值的所有组合
【发布时间】:2021-01-29 10:57:17
【问题描述】:

我有一个包含两列的 data.frame

> data.frame(a=c(5,4,3), b =c(1,2,4))
  a b
1 5 1
2 4 2
3 3 4

我想生成一个包含这些列值的不同组合的 data.frames 列表;上面的例子应该总共有六种可能的情况(如果我错了,请纠正我):

  a b
1 5 1
2 4 2
3 3 4

  a b
1 5 1
2 4 4
3 3 2

  a b
1 5 2
2 4 1
3 3 4

  a b
1 5 2
2 4 4
3 3 1

  a b
1 5 4
2 4 2
3 3 1

  a b
1 5 4
2 4 1
3 3 2

是否有一个简单的功能来做到这一点?我认为 expand.grid 不适合我。

【问题讨论】:

  • 你只关心第二列? apply(gtools::permutations(3, 3, dd$b), 1, function(x) within(dd, b <- x))

标签: r combinations


【解决方案1】:

其实expand.grid 可以在这里工作,但是不推荐因为当df中有很多行时效率相当低(你需要子集@987654323 @ out of n**n 如果你有 n 行)。

以下是使用expand.grid的示例

u <- do.call(expand.grid, rep(list(seq(nrow(df))), nrow(df)))
lapply(
  asplit(
    subset(
      u,
      apply(u, 1, FUN = function(x) length(unique(x))) == nrow(df)
    ), 1
  ), function(v) within(df, b <- b[v])
)

一个更有效的选择是使用包pracma中的perms

library(pracma)
> lapply(asplit(perms(df$b),1),function(v) within(df,b<-v))
[[1]]
  a b
1 5 4
2 4 2
3 3 1

[[2]]
  a b
1 5 4
2 4 1
3 3 2

[[3]]
  a b
1 5 2
2 4 4
3 3 1

[[4]]
  a b
1 5 2
2 4 1
3 3 4

[[5]]
  a b
1 5 1
2 4 2
3 3 4

[[6]]
  a b
1 5 1
2 4 4
3 3 2

【讨论】:

  • 你能改正吗? 找不到函数“asplit”
  • @ToNoY asplit 来自基础 R。您使用的是哪个版本的 R?我的是 4.0.3
【解决方案2】:

使用combinat::permn 创建b 值的所有可能排列,并将其与a 列绑定。

df <- data.frame(a= c(5,4,3), b = c(1,2,4))
result <- lapply(combinat::permn(df$b), function(x) data.frame(a = df$a, b = x))
result

#[[1]]
#  a b
#1 5 1
#2 4 2
#3 3 4

#[[2]]
#  a b
#1 5 1
#2 4 4
#3 3 2

#[[3]]
#  a b
#1 5 4
#2 4 1
#3 3 2

#[[4]]
#  a b
#1 5 4
#2 4 2
#3 3 1

#[[5]]
#  a b
#1 5 2
#2 4 4
#3 3 1

#[[6]]
#  a b
#1 5 2
#2 4 1
#3 3 4

【讨论】:

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