我有一个这样的清单:
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是我现在学习的第一门编程语言。
答案 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))