如何迭代r中矩阵的每个元素

时间:2018-06-28 07:23:00

标签: r loops matrix

上下文:我正在遍历数据集中的几个变量,并在每个变量的因素之间执行成对t.test。 (我已经成功地执行了)。我得到的结果示例如下:

Table of P-values between classes 11,12,13 and 14

我遇到的下一个任务是将这些值中的每一个作为表呈现,其中对于每个元素,如果其值低于某个阈值(例如.05),则该表应动态显示,如果测试之间如果这两个类别通过(如果小于0.05,则为1;如果大于0.05,则为0),该表还应显示通过的测试次数与所进行的测试次数的比例。 (表中的条目数少于对角矩阵中的条目总数的0.05)。参考上面的图像,输出应如下所示: Ideal Matrix

因此,问题本质上是,我必须遍历第一个矩阵(不包括第一行和第一列),应用一个函数,然后生成具有行和列摘要的新行和标头!任何帮助或建议,将不胜感激。

2 个答案:

答案 0 :(得分:3)

R并不是构建此类表的有用工具,但这是一种解决方案。

数据(为方便起见,缩短了小数点):

mat <- matrix(c(.569, .0001, .1211, NA, .0001, .3262, NA, NA, .0001), nrow = 3)

       [,1]   [,2]  [,3]
[1,] 0.5690     NA    NA
[2,] 0.0001 0.0001    NA
[3,] 0.1211 0.3262 1e-04

首先,我们通过在条件0,1下使用ifelse来转换为< .05方案:

mat <- ifelse(mat < .05, 1, 0)

然后我们添加带有rowSums的另一列:

mat <- cbind(mat, rowSums(mat, na.rm = T))

然后,我们在布尔矩阵colSums的{​​{1}}处添加另一行,因此计算每列中非!is.na(mat)的数目:

NA

然后,将右下单元格更改为内部矩阵的mat <- rbind(mat, colSums(!is.na(mat))) 除以内部矩阵的非sum的数量:

NA

最后,我们更改行名和列名:

mat[nrow(mat), ncol(mat)] <- sum(mat[1:nrow(mat)-1, 1:ncol(mat)-1], na.rm = T)/
                             sum(!is.na(mat[1:nrow(mat)-1, 1:ncol(mat)-1]))

最终结果:

rownames(mat) <- c(12:14, "SumCount")
colnames(mat) <- c(11:13, "SumScore")

请注意,无需循环,因为> mat 11 12 13 SumScore 12 0 NA NA 0.0 13 1 1 NA 2.0 14 0 0 1 1.0 SumCount 3 2 1 0.5 对矩阵进行矢量化运算非常有效。

答案 1 :(得分:1)

这里是您想要做的一种方法。

首先,我将组成一个矩阵。

set.seed(3781)
pval <- matrix(runif(9, 0, 0.07), 3)
is.na(pval) <- upper.tri(pval)
dimnames(pval) <- list(12:14, 11:13)

现在是问题。

Ideal <- matrix(as.integer(pval < 0.05), nrow(pval))
dimnames(Ideal) <- dimnames(pval)
Ideal
#   11 12 13
#12  1 NA NA
#13  1  1 NA
#14  1  0  0


r <- sum(Ideal, na.rm = TRUE)/sum(!is.na(Ideal))
r
#[1] 0.6666667

因此,现在所需要做的就是添加额外的行和列。

Ideal <- rbind(Ideal, colSums(!is.na(Ideal)))
Ideal <- cbind(Ideal, rowSums(Ideal, na.rm = TRUE))
Ideal[nrow(pval) + 1, ncol(pval) + 1] <- r
rownames(Ideal)[nrow(pval) + 1] <- "SumCount"
colnames(Ideal)[nrow(pval) + 1] <- "SumScore"