I have a microarray gene expression matrix like this by weird gene IDs in rows.

> head(mat[1:10,1:5])

> dim(mat)
[1] 39302    76

There is matched gene symbol for each of these identifiers in another matrix


> dim(matched)
[1] 23107     1

How I can have matched gene symbol with probe identifiers in the row names of my expression matrix please? The problem is, for one gene symbol we may I tried

> merged <- merge(mat, matched) 
Error: cannot allocate vector of size 6.8 Gb


tmp = paste(matched[rownames(mat)],rownames(mat),sep="_")
> rownames(mat) = tmp


This is my matrix after matching prob identifiers to gene symbol

> head(array[,1:10,1:5])
               GSM482796 GSM482797 GSM482798 GSM482799
1         OR2T6    0.0171   -0.1100   -0.0394   -0.0141
2          EBF1    0.1890    0.0222    0.0832    0.0459
3 DKFZp686D0972    1.9400    0.2530    0.3770    0.8310
4        ATP8B4   -0.1490    0.0690   -0.0637   -0.0527
5      NOTCH2NL    0.1540   -0.3880    0.2160   -0.0812
6        SPIRE1    0.2920    0.1690    0.5500    0.1430

but now for some genes I have several probes. For example for gene A I have several matched probes. So I have repetition for gene A. How I can take mean over the expression of repeated genes please and having an unique value?

  • $\begingroup$ It's not at all clear what format your data are in. Could you add dput(head(matched))? $\endgroup$ Oct 18, 2019 at 11:24

2 Answers 2


You need to think about whether to take the average for all probes belonging to one gene, or simply append the gene name to the probe id.

If it is simply adding a gene name, maybe try this below, note I am assuming that all your rownames of mat can be found in matched

# check whether all rownames are in matched
table(rownames(mat) %in% rownames(matched))
# rename the rows
tmp = paste(matched[match(rownames(mat),rownames(matched)),1],rownames(mat),sep="_")
rownames(mat) = tmp

There are actually two questions.

The first one is about the memory issue. I believe merge from data.table would solve that issue.

The second one would be aggregating or summarizing the identifiers. As @StupidWolf mentioned, you need to have a rule, summing them up, averaging them, ... For this second part one way is using dplyr:

merged_data %>%
  group_by(probe_colum) %>%
  summarise_all(mean or sum or ...) %>%
  mutate(new_column = paste(probe_column, gene_column, sep = "_"))

The same thing can be done faster with data.table:

merged_data[, lapply(.SD, mean or sum or ..., na.rm=TRUE), by = probe_column ] [, new_column := paste(probe_column, gene_column, sep = "_"),]  

.SD means subset of data and your subsets are your groups based on your probes.

  • 1
    $\begingroup$ hey @haci, what you proposed should work. Adding one column to the original expression matrix should not lead to memory issues. I think the problem might be coming from not being able to match the probe id to rownames of the matrix $\endgroup$
    – StupidWolf
    Oct 10, 2019 at 13:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.