【问题标题】:Looping through all combinations of columns in a dataframe [duplicate]循环遍历数据框中的所有列组合[重复]
【发布时间】:2019-11-08 15:20:55
【问题描述】:

如何遍历数据框中所有可能的列组合,然后按函数分组使用这些变量组合?例如,如果我有一个包含 2 列 A 和 B 的数据框,我想运行一个循环,该循环可以先按 A 分组,然后按 B 分组,最后按 AB?

P.S:我尝试过combn函数,但我们只能选择固定数量的组合(2,3等)。但是,我需要所有可能的列组合,这基本上等于列数。 4 列将是:1、2、3 和 4 的所有组合。谢谢!

【问题讨论】:

  • 嗨..您一直在一次又一次地发布相同的问题,但没有任何改进。请在预期输出中包含reproducible example
  • 我意识到,Reprex 是本网站当前的正统观念。既然你没有提供,那我就猜测一下。请参阅下面的答案。如果您正在采用所有可能的列组合,您可能希望考虑您的数据结构不太适合您的问题。后退一点,试着了解大局。一旦你拥有了所有这些组合,你将如何处理它们?仅仅因为你可以提出一个问题,并不意味着它就是你应该解决的问题。
  • 嗨@michael..这正是我想要的(A、B、C、AB、AC、BC、ABC).. 再次感谢您通过数据集进行解释。此外,我想通过 group_by 函数以及数据框的其他列传递这些组合。例如 group_by(date,combination)..所以我需要运行一个循环,一次可以采用一个组合并将其传递给 group_by 函数。任何帮助,将不胜感激。再次感谢!
  • 使用链接帖子中的功能:x <- colnames(mtcars)[1:3]; result <- c(x, unlist(make_combinations(x), recursive = FALSE)); result 应该可以满足您的需求。

标签: r


【解决方案1】:

假设输入为s <- c("a","b","c","d"),则可以通过以下方式获得所有组合:

Map(function(v) apply(v,2, function(x) paste0(x,collapse = "")),sapply(seq_along(s), function(k) combn(s,k)))

给出:

[[1]]
[1] "a" "b" "c" "d"

[[2]]
[1] "ab" "ac" "ad" "bc" "bd" "cd"

[[3]]
[1] "abc" "abd" "acd" "bcd"

[[4]]
[1] "abcd"

此外,如果您希望所有组合都带有单独的字母,那么您可以使用:

> Map(as.data.frame, sapply(seq_along(s), function(k) t(combn(s,k))))
[[1]]
  V1
1  a
2  b
3  c
4  d

[[2]]
  V1 V2
1  a  b
2  a  c
3  a  d
4  b  c
5  b  d
6  c  d

[[3]]
  V1 V2 V3
1  a  b  c
2  a  b  d
3  a  c  d
4  b  c  d

[[4]]
  V1 V2 V3 V4
1  a  b  c  d

希望以上内容对您的问题有所帮助

【讨论】:

  • 非常感谢@Thomals..您的代码有帮助。有没有办法用组合2及以上来分隔字母?例如,代替“ab”,有没有办法可以得到“a”,“b”?这仍然是一种组合,但被分开了。实际上 Group by 函数无法读取“ab”,因为不存在此名称的列。但是,如果是“a”,“b”,它将分别读取它们,但我将它们组合在一起。再次感谢!
  • 我添加了您所描述的另一种类型的输出。希望这是你需要的@Stats
【解决方案2】:

这不是一个真正的答案,但是一旦你展示了你想要的输出,我就会完成它。这是一个示例表示:

 df=data.frame(A=letters[1:5],
               B=letters[3:7],
               C=letters[22:26])

这是数据框

> df
    A B C
  --------
1 | a c v
2 | b d w
3 | c e x
4 | d f y
5 | e g z

很可能,这不是您的想象,但这是一个起点。

当您考虑 **all* 列的组合时,您是否认为它们会按如下方式附加?

这就是你大致的想法吗?假设您将对所有列子集执行此操作。



df$AB=paste(df$A,df$B,sep='')

|A  |B  |C  |AB |
|:--|:--|:--|:--|
|a  |c  |v  |ac |
|b  |d  |w  |bd |
|c  |e  |x  |ce |
|d  |f  |y  |df |
|e  |g  |z  |eg |

如果您朝这个方向推进,我看到的一个问题是您将如何自动化列的命名。我的建议是备份并弄清楚一旦获得这些值将如何使用它们。

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 2018-10-16
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多