2015-10-28 2 views
0

Я ищу способ получить имена столбцов и строк для значений в матрице, в которой значение равно >= среднее значение столбца, которое оно . Я новичок в матрицах 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

Вы можете определить, какие элементы 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 

Все, что остается, это преобразование c номера оленей и строк к связанным им именам, которые мы делаем в следующих двух строках кода с простой индексацией.

Смежные вопросы