2017-08-28 2 views
0

J'ai une question spécifique en ce qui concerne la fonction write.xlsx() du paquet xlsx dans R.R - arrêt write.xlsx() de faire les noms de colonnes syntaxiquement valides

J'ai une matrice contenant des sorties de régressions de données de panel. Pour plus de commodité, je veux exporter ces sorties vers un fichier .xlsx pour l'inclure dans un document Word. Toutefois, lorsque j'exporte la matrice via write.xlsx, les noms de colonne sont automatiquement modifiés pour le style syntaxiquement valide sans autres symboles que des points, des lettres et des chiffres. Ainsi, le vecteur de colonne de la matrice

table_columns <- c("Estimate (All periods)", "", "s.e. (All periods)", "Estimate (Periods 0 & 1)", "", "s.e. (Periods 0 & 1)")

("" sont les noms de colonnes vides parce que ces colonnes contiennent des indicateurs étoile pour les valeurs p) devient

Estimate..All.periods.|V2|s.e...All.periods.|Estimate..Periods.0...1.|V5|s.e...Periods.0...1.

est-il un moyen de supprimer ce reformatage de sorte que je n'ai pas besoin d'éditer le fichier .xlsx après la sortie?

-Edit- pour rendre les choses plus faciles à comprendre:

J'ai un vecteur table_rows avec c("All periods", " Std. error (All periods)", "Periods 0 & 1", " Std. error (Periods 0 & 1)") et un vecteur table_columns avec c("(1) 1AM - 6AM", "", "(2) 6AM - 10AM", "", "(3) 10AM - 6PM", "", "(4) 6PM - 10PM", "", "(5) 10PM - 1AM", "", "(6) Daily", "")

Ceux-ci sont utilisés pour définir les dimnames de la matrice table avec matrix(c(table_1, table_1p, table_2, table_2p, table_3, table_3p, table_4, table_4p, table_5, table_5p, table_6, table_6p), 4, 12, dimnames = list(table4_rows, table4_columns))

table_odd et table_oddp désignent les vecteurs colonne contenant des estimantes et leurs indicateurs de niveau p et table_even les erreurs standard dans les parenthèses. Tous les vecteurs sont de type chr

Je lance write.xlsx(table, paste0(getwd(), "/results.xlsx"), sheetName = "Results") pour convertir la matrice à .xlsx

+3

S'il vous plaît fournir un [exemple reproductible] (https://stackoverflow.com/questions/5963269/how-to-make-a-great -r-reproductible-exemple). Comment appelez-vous exactement 'write.xlsx'? Comment exactement est le data.frame que vous essayez d'écrire formaté. Que fais-tu avec le vecteur 'table_columns'? – MrFlick

+0

Je n'ai pas 'xlsx' installé donc je n'ai pas vérifié, mais je suppose que c'est: vous appelez' write.xlsx' sur un objet 'matrix'. Ensuite, il est converti en interne à un 'data.frame' (voir [lignes 46 et 47 ici] (https://github.com/cran/xlsx/blob/master/R/write.xlsx.R)), qui s'exécute 'make.names()' sur vos noms de colonnes. Je parie que si vous passez 'write.xlsx' un objet qui est * déjà * un' data.frame' avec les noms de colonne comme vous le souhaitez, cela résoudra votre problème. – Gregor

Répondre

0

Vous devez convertir la matrice à une trame de données avant de le passer wo write.xlsx. Sinon, write.xlsx fera le travail avec les arguments defaul. Toutefois, vous devez définir check.names=F et fix.empty.names=F pour désactiver la vérification de la syntaxe et remplacer les noms de colonne vides.

Voici un reproducible example - s'il vous plaît poser des questions futures comme celle-ci:

library(xlsx) 
table_rows <- c("All periods", " Std. error (All periods)", "Periods 0 & 1", " Std. error (Periods 0 & 1)") 
table_columns <- c("(1) 1AM - 6AM", "", "(2) 6AM - 10AM", "", "(3) 10AM - 6PM", "", "(4) 6PM - 10PM", "", "(5) 10PM - 1AM", "", "(6) Daily", "") 
m <- matrix(seq_len(4*12), 4, 12, dimnames = list(table_rows, table_columns)) 
# convert matrix to list so that one can use as.data.frame's fix.empty.names=F: 
df <- as.data.frame(setNames(lapply(1:ncol(m), function(x) m[, x]), colnames(m)), check.names=F, fix.empty.names = F) 
write.xlsx(df, tf <- tempfile(fileext = ".xlsx")) 
shell.exec(tf) 
+0

Cela a fonctionné, mais je l'ai corrigé en utilisant 'table <- as.data.frame (table, optional = TRUE)' à la suite du commentaire de Gregors. J'ai changé le '' "' '' '' '' (avec un espace entre les deux) afin que ces colonnes ne soient pas renommées 'V2' etc. – Icipher

+0

@Icipher Cependant, cela n'affecte que 'check.names', pas' fix.empty.names'. Renommer les noms de colonnes semble un peu plus hackish à moi. ;) – lukeA

+0

'fix.empty.names' cependant ne fonctionne pas quand je l'inclue dans' table <- as.data.frame (table, optionnel = TRUE, fix.empty.names = FALSE) '. Les colonnes sont nommées 'V2' etc. dans ce cas. – Icipher