作者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://www.ptt.cc/bbs/R_Language/M.1490110256.A.AE7.html
→ locka: 感謝andraw大介紹!想藉機請問tapply是不是相當於dplyr的gr 03/22 06:40
→ locka: oup_by+summarise?只不過一個是回傳list一個是dataframe? 03/22 06:40
→ andrew43: 是相似的功能,視個人習慣或時機使用。 03/22 15:38
→ locka: 感謝andrew大大,平常自己都習慣把資料整理成dataframe甚少 03/22 17:58
→ locka: 使用list,所以對tapply不是很熟(抱歉早上剛睡醒拼錯名字QQ) 03/22 18:00