2016-10-26 1 views
1

J'ai un grand ensemble de données pour lequel j'ai besoin de générer plusieurs tables croisées. Ce sont des tables particulièrement bidimensionnelles pour générer des fréquences avec la moyenne et SD.Générer un tableau croisé en R avec la moyenne et SD

donc donner un exemple, j'ai les données ci-dessous -

City <- c("A","B","A","A","B","C","D","A","D","C") 
Q1 <- c("Agree","Agree","Agree","Agree","Agree","Neither","Neither","Disagree","Agree","Agree") 
df <- data.frame(City,Q1) 

Garder les données à l'esprit, je veux générer un tableau croisé avec une moyenne comme ci-dessous -

City    
     A B C D 
Agree 3 2 1 1 
Neither   1 1 
Disagree 1   
Total 4 2 2 2 
Mean 2.5 3 2.5 2.5 

Lors de la génération signifie que l'accord reçoit un poids de 3, aucun n'est affecté d'un poids de 2 et le poids d'un poids en désaccord est de 1. La sortie de la table croisée doit avoir la moyenne juste en dessous de la colonne Total. Il serait bon d'avoir un quadrillage entre chaque colonne et chaque rangée.

Pouvez-vous suggérer comment réaliser ceci dans R?

Répondre

0

Voici une solution possible à l'aide addmargins qui vous permet de passer des fonctions prédéfinies à votre table résultat

wm <- function(x) sum(x * c(3, 1, 2))/sum(x) 
addmargins(table(df[2:1]), 1, list(list(Total = sum, Mean = wm))) 

#   City 
# Q1   A B C D 
# Agree 3.0 2.0 1.0 1.0 
# Disagree 1.0 0.0 0.0 0.0 
# Neither 0.0 0.0 1.0 1.0 
# Total 4.0 2.0 2.0 2.0 
# Mean  2.5 3.0 2.5 2.5 

Si vous voulez SD, vous pouvez simplement ajouter , SD = sd à la liste des fonctions

+0

Merci David !! Une idée de comment ajouter le quadrillage pour avoir un meilleur aperçu de la sortie? –

0

Voici une solution:

x <- table(df$Q1, df$City) #building basic crosstab 
#assigning weights to vector 
weights <- c("Agree" = 3, "Disagree" = 1, "Neither" = 2) 
#getting weighted mean 
weightedmean <- apply(x, 2, function(x) {sum(x * weights)/sum(x)}) 
#building out table 
x <- rbind(x, 
      apply(x, 2, sum), #row sums 
      weightedmean) 
rownames(x)[4:5] <- c("Total", "Mean")