遍历数据帧中列的所有组合

时间:2019-11-07 04:06:29

标签: r

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

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

2 个答案:

答案 0 :(得分:0)

这并不是真正的答案,但是一旦您显示所需的输出,我将完成它。这是一个示例代表:

 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

奇怪的是,这不是,但是这是一个起点。

当您考虑“所有”列组合时,您是否认为它们会按以下方式添加?

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



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 |

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

答案 1 :(得分:0)

假设输入为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

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