如何遍历数据帧中列的所有可能组合,然后在按功能分组使用变量的那些组合?例如,如果我有一个包含2列A和B的数据框,我想运行一个循环,该循环可以首先按A分组,然后按B分组,最后按AB分组?
P.S:我已经尝试了combn函数,但是我们只能选择固定数量的组合(2,3等)。但是,我需要所有可能的列组合,这些组合基本上等于列数。对于4栏将是:1、2、3和4的所有组合。谢谢!
答案 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
希望以上内容对您的问题有帮助