两用表的所有组合

时间:2018-07-10 02:29:13

标签: r combinations

如何从 R 中的数据帧生成所有两种方式表?

some_data <- data.frame(replicate(100, base::sample(1:4, size = 50, replace = TRUE)))
combos <- combn(names(some_data), 2)

以下内容不起作用,正计划在其周围包装一个for循环并将每次迭代的结果存储在某个地方

i=1
table(some_data[combos[, i][1]], some_data[combos[, i][2]])

为什么这不起作用?各个参数的评估均符合预期:

some_data[combos[, i][1]]
some_data[combos[, i][2]]

直接用变量名调用它会产生所需的结果,但是如何遍历此结构中的所有组合?

table(some_data$X1, some_data$X2)

1 个答案:

答案 0 :(得分:2)

combn中有一个FUN参数,因此我们可以使用它来提取'some_data',然后在table中获取array的输出

out <- combn(names(some_data), 2, FUN = function(i) table(some_data[i]))

关于OP帖子中的问题

table(some_data[combos[, i][1]], some_data[combos[, i][2]])

它们都是data.frame,我们可以将其提取为向量,并且应该可以工作

table(some_data[, combos[, i][1]], some_data[, combos[, i][2]])
                ^^                           ^^

或更紧凑

table(some_data[combos[, i]])

更新

combn默认情况下具有simplify = TRUE,即它将输出转换为数组。假设,如果我们有不对称的组合,那么除非我们在指定table的情况下将其转换为factor,否则这将导致levels输出的尺寸不同。 array只能容纳固定尺寸。如果某些元素的尺寸发生变化,则由于它是一个数组,因此会导致错误。一种方法是使用simplify = FALSE返回list,而list没有限制。

这是先前代码失败的示例

set.seed(24)
some_data2 <- data.frame(replicate(5, base::sample(1:10, size = 50, 
     replace = TRUE))) 
some_data <- data.frame(some_data, some_data2)

out1 <- combn(names(some_data), 2, FUN = function(i)
            table(some_data[i]), simplify = FALSE)

is.list(out1)
#[1] TRUE
length(out1)
#[1] 5460