我正在寻找一种方法来获取矩阵中值的列和行名称,其值为>=
它所在列的平均值。我是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))
答案 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
剩下的就是将列号和行号转换为它们的关联名称,我们将在接下来的两行代码中使用简单的索引编写这些名称。