我有一個我想擺脫的循環,我只是不太明白。說我有一個數據幀:在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