作者celestialgod (天)
看板R_Language
标题Re: [问题] ?aggregate example问题
时间Tue Sep 8 21:01:37 2015
# 我固定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://webptt.com/cn.aspx?n=bbs/R_Language/M.1441717300.A.64F.html
1F:推 buzz20374: 研究中,谢谢! 09/08 21:02
※ 编辑: celestialgod (111.248.8.123), 09/08/2015 21:14:30