【问题标题】:R - Select unique combinations of values from within the same columnR - 从同一列中选择唯一的值组合
【发布时间】:2016-01-05 12:51:43
【问题描述】:

假设一个数据框的结构如下:

ColA  ColB
A     1
A     2
A     4
B     3
B     2
B     4
C     1
C     1
C     1

是否可以选择 A、B 和 C 的总和为 7 的所有组合(使用 A、B 和 C 各一次),例如如下:

ColA  Combination1  Combination2
A     2             4
B     4             2
C     1             1

或者,循环遍历 A、B 和 C 的所有唯一组合以确定它们的总数然后列绑定它们会更好吗?如果是这样,假设第一个数据帧结构中的数据,我将如何遍历 A、B 和 C 的唯一组合?

【问题讨论】:

  • 您如何确定 Combination1 和 Combination2 列的值?

标签: r unique combinations


【解决方案1】:

这是我的建议:

df <- read.table( header =TRUE,
                  text = "ColA  ColB
                          A     1
                          A     2
                          A     4
                          B     3
                          B     2
                          B     4
                          C     1
                          C     1
                          C     1")

X <- tapply(df$ColB, df$ColA, unique)
G <- expand.grid(X)
G <- G[rowSums(G)==7, ]

Combinations <- data.frame(t(G))
colnames(Combinations) <- paste0("Comb_", 1:ncol(Combinations))

列表X 包含ABC 的唯一值:

X
#$A
#[1] 1 2 4

#$B
#[1] 3 2 4

#$C
#[1] 1

然后expand.grid 构建笛卡尔积G,即这些唯一值的组合:

G
#  A B C
#1 1 3 1
#2 2 3 1
#3 4 3 1
#4 1 2 1
#5 2 2 1
#6 4 2 1
#7 1 4 1
#8 2 4 1
#9 4 4 1

G &lt;- G[rowSums(G)==7,]之后只剩下总和为7的组合:

G
#  A B C
#6 4 2 1
#8 2 4 1

最后将矩阵G中的数据放入data.frameCombinations

Combinations
#  Comb_1 Comb_2
#A      4      2
#B      2      4
#C      1      1

【讨论】:

  • 感谢您的帮助!有 9 种独特的组合,其中 7 旨在作为列的总值。然后,您将如何根据列中值的总和过滤返回的列?
  • 顺便说一句,你真的不需要Combinations,是吗?
  • 我已经编辑了我的答案。现在只剩下总和为 7 的组合了。
  • @CathG tapply 为您节省了对split 的调用:tapply(df$ColB, df$ColA, unique)
  • so subset(x=expand.grid(tapply(df$ColB, df$ColA, unique)), A+B+C==7) 是一种单线解决方案
猜你喜欢
  • 2014-06-28
  • 2016-10-25
  • 2012-01-24
  • 1970-01-01
  • 2012-08-20
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多