Re: [問題] ?aggregate example問題
# 我固定seed,方便可以重生例子
set.seed(100)
testDF = data.frame(values = sample(1:3, 10, TRUE),
by1 = sample(LETTERS[1:5], 10, TRUE))
testDF
# values by1
# 1 1 D
# 2 1 E
# 3 2 B
# 4 1 B
# 5 2 D
# 6 2 D
# 7 3 B
# 8 2 B
# 9 2 B
# 10 1 D
如果我要計算屬於各類別的個數:
aggregate(testDF, by = list(testDF$by1), FUN = length)
# Group.1 values by1
# 1 B 5 5
# 2 D 4 4
# 3 E 1 1
但是寫這樣會把by1自己也算進來,可以考慮這樣寫:
aggregate(. ~ by1, data=testDF, FUN = length)
# by1 values
# 1 B 5
# 2 D 4
# 3 E 1
例子的by1, by2要另立變數,是為了當引言,介紹這種方式。
如果我要計算屬於各類別的平均值:
aggregate(testDF$values, by = list(testDF$by1), FUN = mean)
# Group.1 x
# 1 B 2.0
# 2 D 1.5
# 3 E 1.0
這個方法是為了避免by1都是字串而報錯
所以在aggregate的時候要把values另外拉出來
下面有更好的寫法:
aggregate(. ~ by1, data=testDF, FUN = mean)
# by1 values
# 1 B 2.0
# 2 D 1.5
# 3 E 1.0
如果看懂了簡單的例子
再用一個複雜一點的,這時候看應該就簡單很多了:
set.seed(100)
testDF = data.frame(values = sample(1:3, 10, TRUE),
values_2 = sample(1:4, 10, TRUE),
by1 = sample(LETTERS[1:3], 10, TRUE),
by2 = sample(LETTERS[1:3], 10, TRUE))
# values values_2 by1 by2
# 1 1 3 B B
# 2 1 4 C C
# 3 2 2 B B
# 4 1 2 C C
# 5 2 4 B C
# 6 2 3 A C
# 7 3 1 C A
# 8 2 2 C B
# 9 2 2 B C
# 10 1 3 A A
aggregate(. ~ by1 + by2, data=testDF, FUN = length)
# by1 by2 values values_2
# 1 A A 1 1
# 2 C A 1 1
# 3 B B 2 2
# 4 C B 1 1
# 5 A C 1 1
# 6 B C 2 2
# 7 C C 2 2
aggregate(. ~ by1 + by2, data=testDF, FUN = mean)
# by1 by2 values values_2
# 1 A A 1.0 3.0
# 2 C A 3.0 1.0
# 3 B B 1.5 2.5
# 4 C B 2.0 2.0
# 5 A C 2.0 3.0
# 6 B C 2.0 3.0
# 7 C C 1.0 3.0
建議可以直接學dplyr 可以參考拙作 #1LhpJCfB (R_Language)
aggregate其實在dplyr就是group_by + summarise
最後補充一下:
不知道你有沒有學過tapply
其實aggregate是tapply的強化板
像是第一個例子 計算長度
tapply(testDF$values, list(testDF$by1), length)
# B D E
# 5 4 1
差別只是tapply出來是向量,aggregate是data.frame
而且aggregate可以直接用公式做計算,比較快
※ 引述《buzz20374 ()》之銘言:
: [問題類型]:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: [軟體熟悉度]:
: 新手(沒寫過程式,R 是我的第一次)
: [問題敘述]:
: ?aggregate 中的一個example
: ## example with character variables and NAs
: testDF <- data.frame(v1 = c(1,3,5,7,8,3,5,NA,4,5,7,9),
: v2 = c(11,33,55,77,88,33,55,NA,44,55,77,99) )
: by1 <- c("red", "blue", 1, 2, NA, "big", 1, 2, "red", 1, NA, 12)
: by2 <- c("wet", "dry", 99, 95, NA, "damp", 95, 99, "red", 99, NA, NA)
: aggregate(x = testDF, by = list(by1, by2), FUN = "mean")
: 我研究了很久,還是想不懂。
: http://imgur.com/GziYRRP

: 像是 FUN="mean" 到底作用了甚麼?
: 最後的執行的結果也看不懂。(?aggregate前面的例子會)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.248.8.123
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1441717300.A.64F.html
推
09/08 21:02, , 1F
09/08 21:02, 1F
※ 編輯: celestialgod (111.248.8.123), 09/08/2015 21:14:30
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章