2015-07-22 1 views
1

У меня есть три разреженных матрицы dgCMatrix, построенные с использованием пакета Matrix. Строки этих двух матриц находятся не в том же порядке, поэтому я хотел бы изменить их на имена розеток, чтобы я мог добавить три матрицы вместе. У кого-нибудь есть намек на быстрый способ сделать это?R - переупорядочение разреженной матрицы по именам ростов

Спасибо большое,

Николя

Вот небольшой пример, где ZZ неправильно, потому что матрицы не в том же порядке:

dat <-data.frame(fac1=factor(c("small","large"),levels=c("small","large","medium")),fac2=factor(c("medium","large"),levels=c("medium","large","small")),fac3=factor(c("small","medium"),levels=c("small","medium","large"))) 

Zl <- lapply(c("fac1","fac2","fac3"), function(nm) Matrix:::fac2sparse(dat[[nm]], "d",drop=F)) 

ZZ <- Reduce("+", Zl[-1], Zl[[1]]) 
+0

Я не думаю, что я изменит что-либо в последовательности записей, хранящихся в разреженной матрице. Для обычной матрицы или dataframe решение ниже, безусловно, работает, но я не уверен, что индексирование ненулевых элементов в dgCMatrix будет по-прежнему иметь смысл после изменения порядка строк. – RHertel

ответ

0

Я добавил фиктивный пример для большей ясности. Спасибо за ваш ответ Миккель, он на самом деле работает, используя:

Z1 <- Matrix:::fac2sparse(dat$fac1, "d",drop=F) 
Z1 <- Z1[order(row.names(Z1)),] 

Z2 <- Matrix:::fac2sparse(dat$fac2, "d",drop=F) 
Z2 <- Z2[order(row.names(Z2)),] 

Z3 <- Matrix:::fac2sparse(dat$fac3, "d",drop=F) 
Z3 <- Z3[order(row.names(Z3)),] 

ZZ <- Z1+Z2+Z3 

Я обнаружил, что альтернативное решение было сортировать уровни факторов перед использованием lapply:

dat$fac1 <- factor(dat$fac1,levels=sort(levels(dat$fac1)) 
dat$fac2 <- factor(dat$fac2,levels=sort(levels(dat$fac2)) 
dat$fac3 <- factor(dat$fac3,levels=sort(levels(dat$fac3)) 

Zl <- lapply(c("fac1","fac2","fac3"),function(nm) Matrix:::fac2sparse(dat[[nm]],"d",drop=F)) 

ZZ <- Reduce("+", Zl[-1], Zl[[1]])