作者andrew43 (讨厌有好心推文後删文者)
看板R_Language
标题Re: [问题] for回圈不会写
时间Tue Mar 21 23:30:52 2017
这用 tapply 就可以直接解,像这样:
tapply(iris$Petal.Length, iris$Species, mean)
不过如果是要练习 for loop,
以下给一个初学者容易理解的解法。
# 初始化一个 list,并给名字。
ans <- vector("list", length(levels(iris$Species)))
names(ans) <- levels(iris$Species)
# 利用 names(ans) 来当 for loop 里的变数
for(i in names(ans)){
which.row <- which(iris$Species == i)
ans[[i]] <- mean(iris$Petal.Length[which.row])
}
# 结果如下
print(ans)
※ 引述《anyonred (任意红)》之铭言:
: 题目是
: # 请计算Petal.Length在三种Species的平均值
: # 请将三种结果分别存到一个named list之中
: # list elements 的名称对应到类别,包含的值则代表对应的Species在Petal.Length的
: 平均值
: # 可以参考後面`stopifnot`的提示
: answer2 <- local({
: for name in names(iris$Species){iris$Species(name)<-mean(Petal.length(name))
: })
: (上面这段是我自己写的,但我不清楚我错在哪里,希望有人可以跟我说下)
: stopifnot(is.list(answer2))
: stopifnot(length(answer2) == 3)
: stopifnot(names(answer2) == c("setosa", "versicolor", "virginica"))
: local({
: for(name in unique(iris$Species)) {
: stopifnot(is.numeric(answer2[[name]]))
: stopifnot(length(answer2[[name]]) == 1)
: }
: })
: 其实stopifnot我看没有懂,我初学dataframe一段时间 ,希望有人可以教我写这题
: 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.135.110.74
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1490110256.A.AE7.html
1F:→ locka: 感谢andraw大介绍!想藉机请问tapply是不是相当於dplyr的gr 03/22 06:40
2F:→ locka: oup_by+summarise?只不过一个是回传list一个是dataframe? 03/22 06:40
3F:→ andrew43: 是相似的功能,视个人习惯或时机使用。 03/22 15:38
4F:→ locka: 感谢andrew大大,平常自己都习惯把资料整理成dataframe甚少 03/22 17:58
5F:→ locka: 使用list,所以对tapply不是很熟(抱歉早上刚睡醒拼错名字QQ) 03/22 18:00