2017-02-09 1 views
1

Puis-je balayer une liste de tables pour obtenir des probabilités conditionnelles ou dois-je balayer chaque table individuellement? Voici quelques données que je viens d'inventer, de même que les sorties de la table, pour démontrer mon problèmeDivision d'éléments de table par sommes de colonnes pour plusieurs tables

positions <- c("forward", "midfield", "defence", "goalkeeper", rep("forward", 5), "defender") 
nationality <- c(rep("IRE", 3), "GER", "ITA", "ENG", "FRA", "BRA", "SCO", "ESP") 
teams <- c("Milan", "Juventus", "Lazio", "Palermo", "Milan", "Juventus", "Chievo", "Siena", "Parma", "Napoli") 



dF <- data.frame(Team = factor(teams), 
       Position = factor(positions), 
       Nationality = factor(nationality), 
       stringsAsFactors = T) 

t1 <- t(table(dF$Nationality, dF$Position)) 
t2 <- t(table(dF$Nationality, dF$Team)) 



       BRA ENG ESP FRA GER IRE ITA SCO 
    defence  0 0 0 0 0 1 0 0 
    defender  0 0 1 0 0 0 0 0 
    forward  1 1 0 1 0 1 1 1 
    goalkeeper 0 0 0 0 1 0 0 0 
    midfield  0 0 0 0 0 1 0 0 



      BRA ENG ESP FRA GER IRE ITA SCO 
    Chievo  0 0 0 1 0 0 0 0 
    Juventus 0 1 0 0 0 1 0 0 
    Lazio  0 0 0 0 0 1 0 0 
    Milan  0 0 0 0 0 1 1 0 
    Napoli  0 0 1 0 0 0 0 0 
    Palermo 0 0 0 0 1 0 0 0 
    Parma  0 0 0 0 0 0 0 1 
    Siena  1 0 0 0 0 0 0 0 

Ce que je dois faire est de diviser chaque entrée de table par la somme de la colonne afin d'obtenir des probabilités conditionnelles. Je sais que je peux utiliser la fonction de balayage appliquée à chaque table, mais je me demandais si elle peut être appliquée à une liste de tables via lapply ou par une boucle for? J'ai essayé les deux sans succès. J'ai également essayé la fonction de balayage sans succès.

Par exemple:

tbl_list <- list(t1, t2) 

for(tbl in tbl_list) { 
    tbl <- sweep(tbl, 2, colSums(tbl), `/`) 
} 
+0

Ça marche bien merci. Que se passe-t-il exactement avec les deux fonctions que vous avez définies ici? – Seanosapien

Répondre

2

Si les tables sont dans une liste, vous pouvez être en mesure d'utiliser sapply en boucle sur eux comme suit

sapply(tbl_list, function(y) apply(y, 2, function(x) x/sum(x))) 

Nous en boucle sur les éléments de tbl_list avec sapply(tbl_list et leur appliquer function(y). Chaque élément (t1 et t2) devient successivement y et subit function(y), ce qui correspond à apply(y, 2, function(x) x/sum(x)). À l'intérieur apply, nous appliquerons function(x) aux MARGIN2 (colonnes). function(x) divise fondamentalement chaque élément des colonnes de y avec la somme des colonnes respectives.

+1

Okay. C'est plus clair pour moi maintenant. Bien expliqué et merci encore. – Seanosapien