用于不同ID的xtabs函数循环

时间:2015-02-19 13:44:39

标签: r loops dataframe

我刚刚开始编写函数和循环并遇到了一个问题: 我正在尝试使用xtabs函数单独找到几个主题ID的频率,但无法弄清楚如何执行此操作。

所以我有一个数据框,通常会在所有ID中执行此操作

xtabs(~choice+ diff+indicator, data = df)

但是,我想单独为每个ID做一遍,然后进行更多分析(例如平均选择概率)。

我尝试通过拆分df

来做到这一点
split_df<-split(df, df$ID)
for (b in seq_along(split_df)) {
 print(xtabs(choice + diff+indicator, data = split_df[[b]]))
}

理想情况下,我希望有一个包含结果的数据框列表(每个ID一个),然后用它做更多的分析。我不知道这一点。 或者,它可能有一些内置功能,但我不知道一个。

由于 劳拉

1 个答案:

答案 0 :(得分:1)

对于bylapply而不是for循环,这是一个很好的用例。基本上,结果是相同的,但没有编写循环的开销,迭代它,并存储适当的结果。以下是一个使用内置mtcars数据集的简单示例:

b <- by(mtcars, mtcars$gear, FUN = function(d) xtabs(~cyl + vs + am, data = d))
l <- lapply(split(mtcars, mtcars$gear), FUN = function(d) xtabs(~cyl + vs + am, data = d))

我们可以使用str来查看我们创建的内容:

> str(b, 1)
List of 3
 $ 3: xtabs [1:3, 1:2, 1] 0 0 12 1 2 0
  ..- attr(*, "dimnames")=List of 3
  ..- attr(*, "class")= chr [1:2] "xtabs" "table"
  ..- attr(*, "call")= language xtabs(formula = ~cyl + vs + am, data = d)
 $ 4: xtabs [1:2, 1:2, 1:2] 0 0 2 2 0 2 6 0
  ..- attr(*, "dimnames")=List of 3
  ..- attr(*, "class")= chr [1:2] "xtabs" "table"
  ..- attr(*, "call")= language xtabs(formula = ~cyl + vs + am, data = d)
 $ 5: xtabs [1:3, 1:2, 1] 1 1 2 1 0 0
  ..- attr(*, "dimnames")=List of 3
  ..- attr(*, "class")= chr [1:2] "xtabs" "table"
  ..- attr(*, "call")= language xtabs(formula = ~cyl + vs + am, data = d)
 - attr(*, "dim")= int 3
 - attr(*, "dimnames")=List of 1
 - attr(*, "call")= language by.data.frame(data = mtcars, INDICES = mtcars$gear, FUN = function(d) xtabs(~cyl + vs + am, data = d))
 - attr(*, "class")= chr "by"

> str(l, 1)
List of 3
 $ 3: xtabs [1:3, 1:2, 1] 0 0 12 1 2 0
  ..- attr(*, "dimnames")=List of 3
  ..- attr(*, "class")= chr [1:2] "xtabs" "table"
  ..- attr(*, "call")= language xtabs(formula = ~cyl + vs + am, data = d)
 $ 4: xtabs [1:2, 1:2, 1:2] 0 0 2 2 0 2 6 0
  ..- attr(*, "dimnames")=List of 3
  ..- attr(*, "class")= chr [1:2] "xtabs" "table"
  ..- attr(*, "call")= language xtabs(formula = ~cyl + vs + am, data = d)
 $ 5: xtabs [1:3, 1:2, 1] 1 1 2 1 0 0
  ..- attr(*, "dimnames")=List of 3
  ..- attr(*, "class")= chr [1:2] "xtabs" "table"
  ..- attr(*, "call")= language xtabs(formula = ~cyl + vs + am, data = d)

在这种情况下,我认为lapply的结果可能更接近你想要的结果,但是(正如你可以看到的那样)结构非常相似 - 两者都是{{1}的列表对象。