>上下文:我正在迭代数据集中的几个变量,并在每个变量的因子之间执行成对t.test。(我已经成功地做到了(。我得到的结果示例如下:
类 11、12、13 和 14 之间的 P 值表
我遇到困难的下一个任务是将这些值中的每一个呈现为一个表格,对于每个元素,如果其值低于某个阈值(例如 .05(,那么表格应动态显示两个类之间的测试是否通过(如果低于 0.05,则用 1 表示,如果高于 0.05,则用 0 表示(该表还应显示通过的测试数量的比率作为所进行的测试数量的比例。(下表中的条目数超过对角矩阵中的条目总数 0.05(。参考上面的图像,输出应如下所示: 理想矩阵
所以问题本质上是我必须遍历第一个矩阵(不包括第一行和第一列(,应用一个函数,然后生成一个带有行和列摘要的新行和标题!任何帮助或建议将不胜感激。
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
首先,我们使用条件为< .05
的ifelse
转换为0,1
方案:
mat <- ifelse(mat < .05, 1, 0)
然后我们添加另一列,rowSums
:
mat <- cbind(mat, rowSums(mat, na.rm = T))
然后我们添加另一行,colSums
布尔矩阵!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
请注意,不需要循环,因为R
对矩阵进行矢量化操作非常有效。
这是做你想做的事的一种方法。
首先,我将组成一个矩阵。
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"