我有一个我想摆脱的循环,我只是不太明白。说我有一个数据帧:在lapply中删除循环
tmp = data.frame(Gender = rep(c("Male", "Female"), each = 6),
Ethnicity = rep(c("White", "Asian", "Other"), 4),
Score = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
然后我要计算的均值在两个性别和种族列每个级别,这将使:
$Female
[1] 9.5
$Male
[1] 3.5
$Asian
[1] 6.5
$Other
[1] 7.5
$White
[1] 5.5
这是很容易做到,但我不想使用循环 - 我正在追求速度。所以我目前有以下几种:
for(i in c("Gender", "Ethnicity"))
print(lapply(split(tmp$Score, tmp[, i]), function(x) mean(x)))
显然,这使用了一个循环,并且是我卡住的地方。
可能有一个功能已经做了这种事情,我不知道。我看过聚合,但我不认为这就是我想要的。
我基于您发布的代码与当前发布的三个答案进行了基准测试,并且您在此帖子中的代码实际上是小型和大型测试用例中最快的代码。 arvi1000的解决方案具有相似的速度,其他两种解决方案的速度要慢2-3倍。这真的强调,用'sapply'或类似的词替换'for'不一定会提高效率。我鼓励你使用'microbenchmark'包来调查你的用例的所有方法的效率。 – josliber 2014-09-24 15:24:42
如果您可以不使用print(),您将拥有更快的代码。此外,2个独立的乐团与性别和种族硬编码将避免循环和额外的*复杂性。 – ARobertson 2014-09-24 16:31:10
Fyi,我用'data.table'运行了一个microbenchmark。与josilber提到的方法相比,不会提高这个小数据集的速度。 – Vlo 2014-09-24 17:36:26