专栏&矩阵值的行名称大于其对应列

时间:2015-10-28 00:09:30

标签: r matrix

我正在寻找一种方法来获取矩阵中值的列和行名称,其值为>=它所在列的平均值。我是R矩阵的新手。

m <- matrix(c(1:20), rnow=4)
colnames(m) <- c("A1","A2", "B1", "B2")
rownames(m) <- c("Y1","Y2", "Z1", "Z2", "Z3")

> m
      A1 A2 B1 B2
   Y1  1  6 11 16
   Y2  2  7 12 17
   Z1  3  8 13 18
   Z2  4  9 14 19
   Z3  5 10 15 20

手段如下。

> colMeans(dummy_expr)
   A1 A2 B1 B2 
   3  8 13 18 

我想得到以下内容:

row col
Z1  A1
Z2  A1
Z3  A1
Z1  A2
Z2  A2
Z3  A2
Z1  B1
Z2  B1
Z3  B1
Z1  B2
Z2  B2
Z3  B2

这是我到目前为止所得到的:

apply(m, 1:2, function(x) x>=colMeans(m))

1 个答案:

答案 0 :(得分:1)

您可以使用m确定which的哪些元素不小于使用arr.ind=TRUE的列的平均值,然后您可以使用标准索引将这些索引转换为行和列名称进入rownames(m)colnames(m)

indices <- which(t(t(m) >= colMeans(m)), arr.ind=TRUE)
indices[,"row"] <- rownames(m)[as.numeric(indices[,"row"])]
indices[,"col"] <- colnames(m)[as.numeric(indices[,"col"])]
indices
#    row  col 
# Z1 "Z1" "A1"
# Z2 "Z2" "A1"
# Z3 "Z3" "A1"
# Z1 "Z1" "A2"
# Z2 "Z2" "A2"
# Z3 "Z3" "A2"
# Z1 "Z1" "B1"
# Z2 "Z2" "B1"
# Z3 "Z3" "B1"
# Z1 "Z1" "B2"
# Z2 "Z2" "B2"
# Z3 "Z3" "B2"

最重要的命令是第一个命令,因此我将逐步完成它。

  • t(m)采用m矩阵的转置。
t(m)
#    Y1 Y2 Z1 Z2 Z3
# A1  1  2  3  4  5
# A2  6  7  8  9 10
# B1 11 12 13 14 15
# B2 16 17 18 19 20
  • t(m) >= colMeans(m)返回t(m)每行中的元素是否不小于colMeans(m)中的对应元素;因为我们转置了m这个结果是逻辑矩阵的转置版本,表明m中的每个元素是否不小于其关联的列均值。
t(m) >= colMeans(m)
#       Y1    Y2   Z1   Z2   Z3
# A1 FALSE FALSE TRUE TRUE TRUE
# A2 FALSE FALSE TRUE TRUE TRUE
# B1 FALSE FALSE TRUE TRUE TRUE
# B2 FALSE FALSE TRUE TRUE TRUE
  • 使用t(t(m) >= colMeans(m)),我们转置结果;现在我们有一个逻辑矩阵,表明m中的每个元素是否超过其列平均值:
t(t(m) >= colMeans(m))
#       A1    A2    B1    B2
# Y1 FALSE FALSE FALSE FALSE
# Y2 FALSE FALSE FALSE FALSE
# Z1  TRUE  TRUE  TRUE  TRUE
# Z2  TRUE  TRUE  TRUE  TRUE
# Z3  TRUE  TRUE  TRUE  TRUE
  • 最后which arr.ind=TRUE将返回设置的行号和列号:
which(t(t(m) >= colMeans(m)), arr.ind=TRUE)
#    row col
# Z1   3   1
# Z2   4   1
# Z3   5   1
# Z1   3   2
# Z2   4   2
# Z3   5   2
# Z1   3   3
# Z2   4   3
# Z3   5   3
# Z1   3   4
# Z2   4   4
# Z3   5   4

剩下的就是将列号和行号转换为它们的关联名称,我们将在接下来的两行代码中使用简单的索引编写这些名称。