【问题标题】:Combine multiple columns in all possible pairs of combinations在所有可能的组合对中组合多列
【发布时间】:2017-01-22 15:12:45
【问题描述】:

我有一个矩阵(比如)x,表示 1.000 名受访者的 33 个不同属性的某些属性的存在/不存在。数据如下所示:

| P1| P2| P3| P4| P5| P6| P7| P8| P9| P10| P11| P12| P13| P14| P15| P16| P17| P18| P19| P19| P20| P21| P22| P23| P24| P25| P26| P26| P27|P28| P29| P30| P31| P32| P33
|  0|  0|  0|  0|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  1|  0|  0|  0|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  0|  1|  0|  0|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  0|  0|  0|  1|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  0|  1|  0|  0|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  0|  0|  0|  0|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  1|  0|  0|  0|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  0|  1|  0|  0|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  0|  0|  0|  0|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0
|  0|  0|  0|  1|  0|  1|  0|  0|  1|   0|   0|   0|   1|   0|   1|   1|   1|   1|   1|   0|   0|   0|   0|   0|   1|   1|   0|   0|   0|  0|   0|   0|   0|   1|   0

我想创建一个数据框,其中 33 列的所有可能组合都是可能的,如果在原始矩阵 x 中两列都有 10,则 1,000 名受访者中的每一个都为 1,否则.

例如,我将使用以下代码获得原始矩阵的第一列和第二列的组合:

ifelse(x[,i] == 1 & x[,i+1] == 1, 1, 0)

我最终应该得到一个包含 1,000 行(受访者数量)和 528 个变量的数据框,因为这是矩阵 x 中 33 列的不同组合对的数量。

在 R 中有没有一种有效的方法来实现这一点?

【问题讨论】:

  • 结果矩阵中元素的顺序是否重要?例如1 1 0 00 1 0 1?

标签: r matrix data-manipulation


【解决方案1】:

我们可以使用combn得到列名的成对组合,对列进行子集化,检查两列元素是否等于1,转换为数值,cbind

res <- do.call(cbind, combn(colnames(df1), 2,
            FUN = function(x) list(+(df1[x[1]] & df1[x[2]]))))
dim(res)
#[1]  10 528

【讨论】:

  • 当我使用代码时,我创建了一个包含 528 列的矩阵,但只有一行 NA。假设我有这个矩阵(只有 10 个观察值): n
  • @Crimc 1 行 NA 不清楚。也许您在列中有一些 NA 值?
  • @Crimc 除了将 'df1' 更改为 'x' 并且还使用 , 分隔矩阵的行/列索引,即 res &lt;- do.call(cbind, combn(colnames(x), 2, FUN = function(y) list(+(x[,y[1]] &amp; x[,y[2]]))));dim(res) #[1] 10 528
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多