我刚刚开始编写函数和循环并遇到了一个问题: 我正在尝试使用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一个),然后用它做更多的分析。我不知道这一点。 或者,它可能有一些内置功能,但我不知道一个。
由于 劳拉
答案 0 :(得分:1)
对于by
或lapply
而不是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}的列表对象。