web-dev-qa-db-fra.com

Erreur R "somme non significative pour les facteurs"

J'ai un fichier appelé rRna_RDP_taxonomy_phylum avec les données suivantes:

364  "Firmicutes"            39.31
244  "Proteobacteria"        26.35
218  "Actinobacteria"        23.54
65   "Bacteroidetes"         7.02
22   "Fusobacteria"          2.38
6    "Thermotogae"           0.65
3     unclassified_Bacteria  0.32
2    "Spirochaetes"          0.22
1    "Tenericutes"           0.11
1     Cyanobacteria          0.11

Et j'utilise ce code pour créer un graphique à secteurs dans R:

if(file.exists("rRna_RDP_taxonomy_phylum")){
    family <- read.table ("rRna_RDP_taxonomy_phylum", sep="\t")
    piedat <- rbind(family[1:7, ],
                as.data.frame(t(c(sum(family[8:nrow(family),1]),
                                "Others",
                                sum(family[8:nrow(family),3])))))
    png(file="../graph/RDP_phylum_low.png", width=600, height=550, res=75)
    pie(as.numeric(piedat$V3), labels=piedat$V3, clockwise=TRUE, col=graph_col, main="More representative Phyliums")
    legend("topright", legend=piedat$V2, cex=0.8, fill=graph_col)
    dev.off()
    png(file="../graph/RDP_phylm_high.png", width=1300, height=850, res=75)
    pie(as.numeric(piedat$V3), labels=piedat$V3, clockwise=TRUE, col=graph_col, main="More representative Phyliums")
    legend("topright", legend=piedat$V2, cex=0.8, fill=graph_col)
    dev.off()
}

J'ai utilisé ce code pour différents fichiers de données et cela fonctionne très bien, mais avec le fichier présenté Adobe, il plante et renvoie le message suivant:

Error in Summary.factor(c(6L, 2L, 1L), na.rm = FALSE) : 
  sum not meaningful for factors
Calls: rbind -> as.data.frame -> t -> Summary.factor
Execution halted

J'ai besoin de comprendre pourquoi il plante avec ce fichier et s'il existe un moyen d'éviter ce type d'erreurs.

Merci!

19
user2245731

L'erreur survient lorsque vous essayez d'appeler sum(x) et x est un facteur.

Cela signifie que l'une de vos colonnes, bien qu'elles ressemblent à des nombres, sont en fait des facteurs (ce que vous voyez est la représentation textuelle)

correction simple, convertir en numérique. Cependant, il faut d'abord une étape intermédiaire de conversion en caractère. Utilisez le suivant:

family[, 1] <- as.numeric(as.character( family[, 1] ))
family[, 3] <- as.numeric(as.character( family[, 3] ))

Pour une explication détaillée des raisons pour lesquelles l'intermédiaire as.character une étape est nécessaire, jetez un œil à cette question: Comment convertir un facteur en entier\numérique sans perte d'information?

39
Ricardo Saporta