I am trying to run DESeq2 analysis on my featureCounts output counts table.

I ran the following code:


samplefile<-"C:/Users/RGB King/Documents/R/~/R/DESeq2_analysis/sample_table.txt"

coldata<-read.table(file=samplefile, sep="\t", header=FALSE, col.names = as.factor(c("","treatment")), row.names=1)

countfile<-"C:/Users/RGB King/Documents/R/~/R/DESeq2_analysis/feature_counts_test_AvABC.txt"
countdata<-read.table(file=countfile, sep="\t", header=FALSE, row.names = 1)


dds <- DESeqDataSetFromMatrix(
    countData = countdata,
    colData = coldata,
    design = ~ treatment

I then get the following error:

Warning message:

In DESeqDataSet(se, design = design, ignoreRank) :

  some variables in design formula are characters, converting to factors

The countdata table looks as follows:


The coldata looks like this:


So after I got the error I found posts on a forum that stated that DESeq2 only recognises "integer" class input values for the analyses. Therefore, I ran the following code:


This then showed me that the data in the countdata table was in "character" class, so to fix this I ran the following:

chars <- sapply(countdata, is.character)
countdata[ , chars] <- as.data.frame(apply(countdata[ , chars], 2, as.integer))

But this then caused the values in the GeneID row to become "NA". So my questions are how can I change the class of just the GeneID row back to what it was? Will this then allow the analysis to run correctly? And in my code for the countdata I do specify "row.names =1" so why does this not keep my values in the GeneID row separate from the rest of the table?

  • $\begingroup$ If the first column is GeneID and your data.frame was called df then do df[,2:ncol(df)] or move GeneID to rownames and then convert to numeric class. $\endgroup$
    – user3051
    Commented Jul 31, 2021 at 14:39
  • $\begingroup$ Hi there, @ATpoint thanks for taking the time to answer I appreciate it. Could you maybe explain how to move the GeneID to row.names in my code? If I can explain better, I need to just keep the cells in GeneID row i.e. "A_1.bam" as a "character" class and change the rest of the cells that contain the DE gene counts to "integer" class. I am not sure if this will work though, but I just want to try it and see if that is why I am getting the error I mentioned in post. $\endgroup$
    – Justin1609
    Commented Jul 31, 2021 at 15:19
  • $\begingroup$ Cause when I run sapply(countdata,class) I still get the following output V7 V8 V9 V10 V11 V12 V13 V14 "character" "character" "character" "character" "character" "character" "character" "character" $\endgroup$
    – Justin1609
    Commented Jul 31, 2021 at 15:44
  • $\begingroup$ Why are you importing your count data with header = false when you clearly have a header? $\endgroup$
    – swbarnes2
    Commented Jul 31, 2021 at 16:39
  • $\begingroup$ Yes apologies I corrected that, however, I still can't resolve the issue of the data in the counts table I input being in "character" class. Is this a common error that one gets when working with featureCounts generated counts tables? It might be worth mentioning, I changed the file from what I got directly as the output file i.e. a file in ASCII text format to a text document in notepad on windows. I am not sure if that maybe caused DESeq2 to recognise the integers as "character" class as well? Would it be better to convert the output of featureCounts to a .csv file format in excel? $\endgroup$
    – Justin1609
    Commented Jul 31, 2021 at 21:24

2 Answers 2


There is nothing wrong with your colData. It is encoded as character rather than factor, and DESeq2 is turning it into factors, that is all that the warning (warning != error) tells. I never needed to convert my matrix to load featureCounts output into DESeq2. Just load the output with the header, use rownames() to move the gene column to rownames, remove all the non-relevant columns (that is usually 1-7) and then feed the remaining one into DESeq2. I have no featureCounts output at hand right now. If you need code then please provide suitable example data via the dput function for easy copy/pasting.

  • $\begingroup$ Hey @ATpoint sorry your suggestion on my other question reminded me about this. I got assistance from a friend who works as a bioinformaticist at a private company. He noted that there was an annotation step missing in my data and interestingly even with his code he wrote for me I still got the warning message I mentioned, which he attributed to using RStudio in Windows. I still would like to send examples of my data through to you though, as although I did get an output from his code I am unsure if it is correct. $\endgroup$
    – Justin1609
    Commented Aug 18, 2021 at 13:44

As the warning message is suggesting, you should convert the class of your treatment column in coldata from character to factor.

Use this:
coldata$treatment = factor(coldata$treatment)

  • $\begingroup$ Thank you, I will give that a try $\endgroup$
    – Justin1609
    Commented Aug 24, 2022 at 17:27

Your Answer

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

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