This is a test version of Biostars. For the public version, visit https://www.biostars.org.
How do you rbind two data frames with a different number of columns without loosing rownames?

Hi,

I have two data frames:

> head(df2)
                ILMN_1658176 ILMN_1794782 ILMN_2329927 ILMN_2338268
DwoC_2318_norm      4.895369     7.354273     5.788415     4.732194
DwoC_3395_norm      4.769932     6.718184     5.338058     4.680381
DwoC_6154_norm      4.944610     7.001293     5.351585     4.456892
DwoC_16362_norm     4.637149     5.774219     4.720364     4.687178
DwoC_18296_norm     4.738705     6.941641     5.472976     4.843630
DwoC_21183_norm     4.883878     7.481384     5.755646     4.505568

> head(df1)
               ILMN_1658176     ILMN_2329927     ILMN_1794782     ILMN_2338268
GTEX-1122O 7.06228526333386 7.06228526333386 7.06228526333386 3.57044703372789
GTEX-11EM3 6.05973723132698 6.05973723132698 6.05973723132698  3.4268959808612
GTEX-11EMC 6.38938647129766 6.38938647129766 6.38938647129766 3.47843984281137
GTEX-11EQ9 6.24361469623367 6.24361469623367 6.24361469623367 3.51276310600448
GTEX-11I78 4.56890242439573 4.56890242439573 4.56890242439573 3.48287352055029
GTEX-11OC5 7.26717305438927 7.26717305438927 7.26717305438927 3.34892592791344

I tried to do rbind via:

library(data.table)
a=rbindlist(list(df1, df2), fill = TRUE)

but in my data frame "a" rownames are not present. How do I do rbind and keep them?

Thanks Ana

r

1 answer

This is a pure R question, but here we go: use tidyverse packages

library(dplyr)
library(tibble)

res <- df1 %>% rownames_to_column('rnames') %>% 
               bind_rows(df2 %>% rownames_to_column('rnames')) %>% 
               column_to_rownames('rnames');

res

                    ILMN_1658176 ILMN_1794782 ILMN_2329927 ILMN_2338268
DwoC_2318_norm      4.895369     7.354273     5.788415     4.732194
DwoC_3395_norm      4.769932     6.718184     5.338058     4.680381
DwoC_6154_norm      4.944610     7.001293     5.351585     4.456892
DwoC_16362_norm     4.637149     5.774219     4.720364     4.687178
DwoC_18296_norm     4.738705     6.941641     5.472976     4.843630
DwoC_21183_norm     4.883878     7.481384     5.755646     4.505568
GTEX-1122O          7.062285     7.062285     7.062285     3.570447
GTEX-11EM3          6.059737     6.059737     6.059737     3.426896
GTEX-11EMC          6.389386     6.389386     6.389386     3.478440
GTEX-11EQ9          6.243615     6.243615     6.243615     3.512763
GTEX-11I78          4.568902     4.568902     4.568902     3.482874
GTEX-11OC5          7.267173     7.267173     7.267173     3.348926

Or you can use base R to create new columns from the rownames and move the column value back to rownames once done.

df1$rnames <- rownames(df1);
df2$rnames <- rownames(df2);
res <- rbind(df1,df2);
rownames(res) <- res$rnames;
res <- res[, !(colnames(res) %in% 'rnames')]

Thank you so much, this worked great!

Log in to answer this question.