我希望能够去掉一个循环,但是我不太确定如何做到。比如说我有一个数据框:
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))
我希望您能为Gender和Ethnicity两列的每个级别分别计算平均值,结果如下所示:
我随后要计算Gender和Ethnicity两列中每个级别的平均值,结果如下:
$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)))
显然,这需要使用循环,而我卡在这里了。
可能已经有一个函数可以完成我不知道的这种操作。我看过aggregate,但我认为那不是我想要的。
for
循环替换为sapply
或类似方法并不一定会提高效率。我建议您使用microbenchmark
包来研究所有方法在您的使用情况下的效率。 - josliberdata.table
进行了微基准测试,结果表明在这个小数据集上并没有比 josilber 提到的方法更快。 - Vlo