Sorties de table comme SPSS plus export vers MS Word

Supposons la variable suivante dans R :

test <- c(1,5,4,3,2,3,5,4,2,1,5,1,2,3,4, NA, NA, NA)

Pour obtenir un tableau de fréquences, il existe plusieurs méthodes de calcul

  • fréquences "brutes", c'est-à-dire les fréquences, y compris les NA
  • pourcentages "bruts", comme ci-dessus, juste en pourcentage
  • fréquences "valides", uniquement les fréquences sans NA
  • pourcentages "valides", comme ci-dessus, comme pourcentage

Dans SPSS, vous obtenez cette sortie assez facilement avec la fonction de fréquences.

Cependant, dans R , c'est la douleur dans le cul. Pour l'instant, je n'ai pas réussi à obtenir une table avec les valeurs mentionnées ci-dessus sans dépenser "heures" pour construire cette sortie de table.

Bien sûr, R possède toutes les fonctions nécessaires pour calculer les valeurs, mais il est difficile de les regrouper en une seule sortie, surtout si vous avez des NA, car pour les valeurs "brutes", vous avez besoin d'une ligne pour les NA, pour les valeurs "valides", mais si vous mettez les valeurs ensemble dans une matrice ou autre chose, R se plaint que les lignes pour les scores bruts et valides ne sont pas égales .

Pour faire court, il y a-t-il une possibilité de construire des tables de fréquence de type SPSS dans R ?

Et ma deuxième question est, comment exporter les tableaux vers MS Word.

Le problème dans R est que les tables utilisent des espaces pour séparer les valeurs. Si vous le copiez/collez dans MS Word, vous ne pourrez pas créer une table appropriée.

Je suis conscient qu'il y a des paquets, par ex. R2wd (que je n'ai même pas pu travailler du tout) ou rtf (ce qui fonctionne bien pour moi), mais peut-être que vous avez maintenant d'autres possibilités.

MODIFIER:

La table de sortie de l'exemple ci-dessus devrait ressembler à ceci:

Values    raw frequencies    raw percentage    valid freq.   valid percentage
1         3                  16,67             3             20,00
2         3                  16,67             3             20,00
3         3                  16,67             3             20,00
4         3                  16,67             3             20,00
5         3                  16,67             3             20,00
NA        3                  16,67            /            /

Je dois m'excuser pour cet exemple. J'ai juste tapé au hasard quelques valeurs entre 1 et 5 pour obtenir des fréquences différentes. Il semble que j'ai obtenu involontairement la même fréquence pour chaque valeur. -.-

1
Si vous avez deux questions, il est préférable de simplement poser deux questions distinctes. Dans ce cas particulier, créer une table (dans un data.frame ) et l'exporter dans Word sont deux choses très distinctes.
ajouté l'auteur Paul Hiemstra, source
Je suis d'accord avec ça. Je pensais juste que c'était une sorte de relation. Mais tu as raison. Créer une table est différent de l'exporter vers MS Word.
ajouté l'auteur deschen, source

4 Réponses

Je suis en train de développer un package qui, entre autres choses, permet des sorties de table simples de diverses statistiques (descriptives). Voir un exemple dans cet article de blog ou consultez le package au CRAN .

Exemple de code:

require(sjPlot) # load package
# load sample data
data(efc)
# simple frequency table
sjt.frq(efc$e42dep)

Résultat:

table output in RStudio viewer pane

2
ajouté

Bien que je ne sache pas exactement à quoi ressemblera la table SPSS souhaitée, voici ma meilleure estimation de ce que vous voulez faire.

freqTable <- function(df, freq.digits=4, perc.digits=2){
  q1 <- table(df, useNA="always")                  # "raw" table
  q2 <- q1/sum(q1)                                 # frequencies
  q3 <- c(table(df, useNA="no"), 'NA'=NA)          # "valid" table; with NA 
  q4 <- q3/sum(q3, na.rm=TRUE)                     # frequencies
  rbind(raq.freq=round(q2, freq.digits), 
        raw.perc=round(q2*100, perc.digits), 
        val.freq=round(q4, freq.digits), 
        val.perc=round(q4*100, perc.digits))
}
freqTable(test)

#                 1       2       3       4       5    
#  raq.freq  0.1667  0.1667  0.1667  0.1667  0.1667  0.1667
#  raw.perc 16.6700 16.6700 16.6700 16.6700 16.6700 16.6700
#  val.freq  0.2000  0.2000  0.2000  0.2000  0.2000      NA
#  val.perc 20.0000 20.0000 20.0000 20.0000 20.0000      NA

Pour votre deuxième question, je suggère d'utiliser knitr pour créer des documents dynamiques. Si c'est une chose unique, je trouve que le plus simple est de sauvegarder un fichier CSV et d'importer des mots à partir de là.

write.csv2(freqTable(test), "test_table.csv")
1
ajouté
S'il vous plaît voir la modification de mon message original pour voir comment la table devrait ressembler. Par rapport à votre sortie, il suffit de la transposer. Mais votre exemple montre exactement le problème. Il faut écrire une fonction un peu longue. Je pensais, il pourrait y avoir une façon plus intuitive car ce sont de véritables bases statistiques et devraient être gérables dans tous les logiciels de statistiques, même dans R. S'il vous plaît ne voyez pas cela comme une critique de votre solution plutôt que comme une critique sur R elle-même!
ajouté l'auteur deschen, source

Vous pouvez utiliser le package R2HTML pour obtenir une sortie de type SPSS simplement. C'était très utile pour moi dans les mêmes situations.

1
ajouté

Malheureusement, il semble qu'il n'y ait pas encore de paquet R capable de générer une sortie sympa comme SPSS. La plupart des fonctions de génération de tables semblent définir leurs propres formats spéciaux, classes, etc. Cela vous donne des ennuis si vous voulez exporter ou travailler dessus d'autres façons.
Mais d'après mon expérience, il est possible que R puisse produire une telle sortie. Mais personne ne semble avoir travaillé dessus jusqu'ici et j'ai donc commencé à écrire mes propres fonctions. Je suis heureux de partager le résultat (travail en cours - statut, mais fait le travail) avec vous:

The following function returns for all factor variables in a data.frame the frequency or the percentage (calc="perc") for each level of the factor variable "variable".
The most important thing may be that the output is a simple & user friendly data.frame. So, compared to many other functions, it's no problem to export the results an work with it in any way you want.
One example: looking at the resulting data.frame with the function "View" and then just copy and paste it to Excel, Word, etc.

Je me rends compte qu'il y a beaucoup de potentiel pour d'autres améliorations, c'est-à-dire ajouter une possibilité pour sélectionner le calcul du pourcentage de ligne par rapport à la colonne, etc. mais pour l'instant cela devrait être utile.

contitable <- function( survey_data, variable, calc="freq" ){    

  # Check which variables are not given as factor    
  # and exlude them from the given data.frame    
 survey_data_factor_test <- as.logical( sapply( Survey, FUN=is.factor) )    
  survey_data <- subset( survey_data, select=which( survey_data_factor_test ) )    

  # Inform the user about deleted variables    
  # is that proper use of printing to console during a function call??    
  # for now it worksjust fine...    
  flush.console()        
  writeLines( paste( "\n ", sum( !survey_data_factor_test, na.rm=TRUE),
            "non-factor variable(s) were excluded\n" ) )

  variable_levels <- levels(survey_data[ , variable ])    
  variable_levels_length <- length( variable_levels )    

  # Initializing the data.frame which will gather the results    
  result <- data.frame( "Variable", "Levels", t(rep( 1, each=variable_levels_length ) ) )    
  result_column_names <- paste( variable, variable_levels, sep="." )    
  names(result) <- c("Variable", "Levels", result_column_names )    

  for(column in 1:length( names(survey_data) ) ){       

      column_levels_length <- length( levels( survey_data[ , column ] ) )
      result_block <- as.data.frame( rep( names(survey_data)[column], each=column_levels_length ) )
      result_block <- cbind( result_block, as.data.frame( levels( survey_data[,column] ) ) )
      names(result_block) <- c( "Variable", "Levels" )

      results <- table( survey_data[ , column ], survey_data[ , variable ] )

      if( calc=="perc" ){ 
        results <- apply( results, MARGIN=2, FUN=function(x){ x/sum(x) }) 
        results <- round( results*100, 1 )
      }

      results <- unclass(results)
      results <- as.data.frame( results )
      names( results ) <- result_column_names
      rownames(results) <- NULL

      result_block <- cbind( result_block, results) 
      result <- rbind( result, result_block ) 
}    
result <- result[-1,]        
return( result )    
}
0
ajouté