У меня есть матрица и хотелось бы ее подмножество с помощью сопоставления и функции.подмножество матрицы с использованием сопоставления роунов и определяемой пользователем функции
Пример: случайно заполненная матрица с использованием runif
и set.seed
для воспроизводимости.
set.seed(1)
exp.mat <- matrix(runif(9*6, 5.0, 10), nrow = 9, ncol = 6)
rownames(exp.mat) <- c('a','b1','b2','b3','c','d1','d2','e1','e2')
colnames(exp.mat) <- c('s1','s2','s3','s4','s5','s6')
exp.mat
s1 s2 s3 s4 s5 s6
a 5.353395 6.661973 6.733417 8.562573 6.198147 8.024666
b1 5.497331 8.254352 6.668875 6.999972 5.294672 8.273620
b2 6.581359 6.290084 7.381756 6.626761 8.211441 6.765986
b3 7.593171 7.392726 9.460992 8.785436 9.381346 6.351301
c 8.310025 8.831553 9.321697 6.013461 8.894573 9.963420
d1 7.034151 5.421235 6.949948 8.555606 8.986544 8.167466
d2 9.564380 9.376607 8.886603 5.608460 7.276372 6.066041
e1 6.468017 6.695365 9.803090 6.227443 7.050420 5.646862
e2 7.295329 9.197202 7.173297 5.716522 9.054351 7.390590
Отображение с колонкой, содержащей rown
rownames
из исходной матрицы, столбец map
, содержащих соответствующее отображение.
maps <- data.frame(rown=c('a','b1','b2','b3','c','d1','d2','e1','e1','e1'),
map =c('a','b','b','b','c','d','d','e','f','g'))
maps
rown map
1 a a
2 b1 b
3 b2 b
4 b3 b
5 c c
6 d1 d
7 d2 d
8 e1 e
9 e1 f
10 e1 g
Функция, mean
рассматривается здесь для выбора строк, когда есть несколько сопоставлений (случай 2).
apply(exp.mat, 1, mean)
a b1 b2 b3 c d1 d2 e1 e2
6.922362 6.831470 6.976231 8.160829 8.555789 7.519158 7.796410 6.981866 7.637882
На основе отображений,
- если имеется только одно значение в
rown
отображения, чтобыmap
, то он должен непосредственно скопировать всю строку. например:a
,c
имеют только одно отображение. - Если в
rown
имеется более одного значения, сопоставление сmap
, то он должен скопировать всю строку, которая имеет наибольшее значение из результирующей функции выше. например:b1
,b2
,b3
maps tob
;b3
имеет максимально высокийmean
. Таким образом, он должен выбратьb3
, а такжеd2
. - если есть значение в
rown
, отображающее более чем одно значение вmap
, тогда оно должно отбросить эти строки. например:e1
имеет более одного значения отображенияe
,f
. - если нет сопоставления, то отбросьте строку. например:
e2
не имеет соответствующего отображения.
Ожидаемый результат: subsetted матрица
> exp.mat.trans
s1 s2 s3 s4 s5 s6
a 5.353395 6.661973 6.733417 8.562573 6.198147 8.024666
b 7.593171 7.392726 9.460992 8.785436 9.381346 6.351301
c 8.310025 8.831553 9.321697 6.013461 8.894573 9.963420
d 9.564380 9.376607 8.886603 5.608460 7.276372 6.066041
Пожалуйста, посоветуйте, как добиться этого в эффективной манере?
Я достиг этого Eyeballing и код ниже
exp.mat.trans <- exp.mat[c(1,4,5,7),]
rownames(exp.mat.trans) <- c('a','b','c','d')
Это может быть полезно определить только показатели, поскольку нет никакого преобразования значений?
# Index Subsetting
ind <- c(1,4,5,7)
exp.mat.trans2 <- exp.mat[ind,]
rownames(exp.mat.trans2) <- maps[ind, 'map']
exp.mat.trans
и exp.mat.trans2
такие же!
редактировать
map
и exp.mat
не может быть таким же всегда!
'7.564495' был присвоен до последней строки, когда' карты [, значение: = rowMeans (exp.mat)] 'была выполнена. Но значение должно было быть для 'e2'. Однако это не имеет значения, так как значение «e2» отсутствует. Кроме того, этот подход не работает, если объект 'mapping' не имеет одинаковых строк как« исходная матрица » – Prradep
. Вы правы, я пытаюсь исправить эту проблему, отсортировав значение строки на основе столбца. Это работает для вас? –
@ tobias-bekker: Он работает с этим примером, и я не предвижу никаких проблем. Я буду реализовывать то же самое с моей оригинальной проблемой и дам вам знать в случае возникновения проблем. Благодаря ! – Prradep