R - 通过rownames重新排序稀疏矩阵

时间:2015-07-22 10:24:47

标签: r sparse-matrix

我有三个使用Matrix包构建的dgCMatrix稀疏矩阵。 这两个矩阵的行的顺序不一样,所以我想用rownames对它们进行重新排序,以便我可以将三个矩阵一起添加。 有人会提示快速做到这一点吗?

非常感谢,

尼古拉斯

这是一个小例子,其中ZZ是错误的,因为矩阵的顺序不同:

@Bean
public IntegrationFlow fileReadingFlow() {          
    return IntegrationFlows
            .from(fileMessageSource(),
                    new Consumer<SourcePollingChannelAdapterSpec>() {

                        @Override
                        public void accept(SourcePollingChannelAdapterSpec e) {
                            e.autoStartup(true).poller(Pollers.fixedRate(6000)
                                            .maxMessagesPerPoll(1));
                        }
                    }).transform(Transformers.fileToByteArray())
            .channel(MessageChannels.queue("fileReadingResultChannel"))
            .get();
}

@Bean
public MessageSource<File> fileMessageSource() {

    FileReadingMessageSource source = new FileReadingMessageSource();
    source.setDirectory(new File(localDir));    
    source.setAutoCreateDirectory(true);        
    return source;
}

2 个答案:

答案 0 :(得分:1)

我在网站上找到了这个解决方案:

new_df <- df[ order(row.names(df)), ]

链接:How can I use the row.names attribute to order the rows of my dataframe in R?

答案 1 :(得分:0)

为了更清晰,我添加了一个虚拟示例。 感谢您的回答Mikkel,它实际上使用:

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]])