如何从 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)
答案 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