按多个表的列总和划分表格元素

时间:2017-02-09 16:01:50

标签: r probability

我是否可以扫描表格列表以获取条件概率,还是必须逐个扫描每个表格?以下是我刚刚编写的一些数据以及表格输出,以展示我的问题

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

我需要做的是将每个表条目除以其列的总和,以获得条件概率。我知道我可以使用应用于每个表的扫描功能,但我想知道它是否可以通过lapply或通过for循环应用于表列表?我试过两次都没有成功。我也试过扫描功能但没有成功。

例如:

tbl_list <- list(t1, t2)

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

1 个答案:

答案 0 :(得分:2)

如果表格在列表中,您可以使用sapply循环覆盖它们,如下所示

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

我们将使用tbl_list遍历sapply(tbl_list的元素并将function(y)应用于它们。每个元素(t1t2)将相继变为y并经历function(y) apply(y, 2, function(x) x/sum(x))。在apply内,我们会将function(x)应用于MARGIN 2(列)。 function(x)基本上将y列的每个元素与相应列的总和相除。