如何在不申请的情况下计算列表的平均值

时间:2014-10-19 13:08:34

标签: r

我有一个这样的清单:

test54 <- list(score1=c(3,6,5,7), score2=c(2,3,2,2), score3=c(2,3,4,5), 
               score4=c(1,2,4,5),  score5=c(1,2,1,1))

我想在不使用apply的情况下计算均值,但只能使用for循环和while循环。

有人能告诉我怎么样吗?

这只是一个练习。 R是我现在学习的第一门编程语言。

2 个答案:

答案 0 :(得分:1)

如果您被限制使用任何应用系列函数,则下面的方法可能会显示for循环和列表中发生的情况。或者您可以使用David在评论中建议的方法(更高级)。但我认为对基础知识的基本理解会有所帮助。

mean_list <- list()
for (i in seq_along(test54)) {
  mean_list[i][[1]] <- mean(test54[i][[1]])
}
mean_list
[[1]]
[1] 5.25

[[2]]
[1] 2.25

[[3]]
[1] 3.5

[[4]]
[1] 3

[[5]]
[1] 1.25


unlist(mean_list)
[1] 5.25 2.25 3.50 3.00 1.25

答案 1 :(得分:1)

好的,正如我在这里看到的那样,我们处在一个学习曲线中,让我们说明这样做的所有奇怪/不必要/正确的方法(我能想到的)

数据

test54 <- list(score1=c(3,6,5,7), score2=c(2,3,2,2), score3=c(2,3,4,5), 
               score4=c(1,2,4,5),  score5=c(1,2,1,1))

For循环(不正确)

for(i in seq_len(length(test54))) print(mean(test54[[i]]))
for(i in seq_len(length(test54))) cat(mean(test54[[i]]), "\n")
i <- 1 ; while(i <= length(test54)) {cat(mean(test54[[i]]), "\n") ; i <- i + 1 } # I can't think of a single reason of using `while`. Ever. Unless you are looking for ways to crash R

隐藏for循环(处理列表的常用方法,但在这种特定情况下仍然不是正确的方法)

lapply(test54, mean)
sapply(test54, mean)
vapply(test54, mean, double(1))
by(stack(test54), stack(test54)$ind, FUN = function(x) mean(x[['values']])) # Very weird and inefficient - don't do this. Ever. (see great alternatives for `by` at the end)

一些效率较低的方法(但仍优于for循环)

rowMeans(do.call(rbind, test54))
colMeans(do.call(cbind, test54))

正确的做法(但只是因为我们有colMeans,并不总是我们有这样的功能)

colMeans(data.frame(test54))
colMeans(as.data.frame(test54)) # Probably a bit faster

一些有效的外部包也可以这样做(再次,如果我们没有超高效的colMeans功能)

library(data.table)
setDT(test54)[, lapply(.SD, mean)]

library(dplyr)
test54 %>%
  data.frame %>%
  summarise_each(funs(mean))