supprimer - séparer des données dans r




write.table écrit une colonne vide non désirée menant à l'en-tête quand a des noms (4)

vérifiez cet exemple:

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3]))
> a
  A B C
A 1 4 7
B 2 5 8
C 3 6 9

la table s'affiche correctement. Il y a deux façons différentes de l'écrire dans un fichier ...

write.csv(a, 'a.csv') qui donne comme prévu:

"","A","B","C"
"A",1,4,7
"B",2,5,8
"C",3,6,9

et write.table(a, 'a.txt') qui se write.table(a, 'a.txt')

"A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9

en effet, il manque un onglet vide .... ce qui est une douleur dans le cul pour les choses en aval. Est-ce un bug ou une fonctionnalité? Y at-il un travail autour? (autre que write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE )

À la vôtre, yannick


Citer ?write.table , fichiers CSV de section:

Par défaut, il n'y a pas de nom de colonne pour une colonne de noms de lignes. Si col.names = NA et row.names = TRUE un nom de colonne vide est ajouté, qui est la convention utilisée pour les fichiers CSV à lire par les feuilles de calcul.

Donc vous devez faire

write.table(a, 'a.txt', col.names=NA)

et vous obtenez

"" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9

J'ai révisé une fonction simple de @mnel, qui ajoute de la flexibilité en utilisant des connexions. Voici la fonction:

my.write <- function(x, file, header, f = write.csv, ...){
# create and open the file connection
datafile <- file(file, open = 'wt')
# close on exit 
on.exit(close(datafile))
# if a header is defined, write it to the file (@CarlWitthoft's suggestion)
if(!missing(header)) {
writeLines(header,con=datafile, sep='\t')
writeLines('', con=datafile, sep='\n')
}
# write the file using the defined function and required addition arguments  
f(x, datafile,...)
}

Vous pouvez spécifier la fonction 'write.table', 'write.csv', 'write.delim', etc.

À votre santé!


Pour toute personne travaillant dans le tidyverse (dplyr, etc.), la fonction rownames_to_column() du paquet tibble peut être utilisée pour convertir facilement row.names en colonne, par exemple:

library('tibble')
a = as.data.frame(matrix(1:9, nrow=3, ncol=3, 
                  dimnames=list(LETTERS[1:3], LETTERS[1:3])))

a %>% rownames_to_column('my_id')

  my_id A B C
1     A 1 4 7
2     B 2 5 8
3     C 3 6 9

En combinant cela avec l'option row.names=FALSE dans write.table() obtient un résultat avec des noms d'en-tête pour toutes les colonnes.


Une légère modification de la réponse très utile de @Marek va ajouter un en-tête à la colonne des noms de base: ajoutez temporairement les noms de base comme première colonne dans le fichier data.frame, et écrivez cela, en ignorant les véritables noms.

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3]))
> write.table(data.frame("H"=rownames(a),a),"a.txt", row.names=FALSE)

et vous obtenez

"H" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9




write.table