今天介绍plyr包几个简单的函数:arrange, mutate,summarise, join, match_df, rename, round_any, count. 这几个函数在plyr包精华ddply系列函数中有不同程度的应用。
arrange
语法:arrange(data.frame,colnames|desc(colnames)))
用于对数据框的一列或几列排序
set.seed(124)
data <- data.frame(A=LETTERS[sample(5,replace=TRUE)],
B=letters[sample(5,replace=TRUE)],
C=round(runif(5,0,1),3),
D=sample(100)[1:5])
#对数据框data先按A升序排列在按D降序排列
arrange(data,A,desc(D))
mutate
语法:mutate(data.frame,newcolname=expression(oldcolname))
用于对数据框中的列进行某种函数运算生成新列。
mutate(data,AD=paste(A,D,sep=''),CD=C*100+D,CCD=CD+C)
mutate在某种程度上可以看成是transform的升级版,运行速度比transform快的多
# mutate 比 transform 快的多
system.time(transform(baseball, avg_ab = ab / g))
system.time(mutate(baseball, avg_ab = ab / g))
summarise
语法:summarise(data.frame,newcolname=expression(oldcolname))
类似与mutate,但创造新的数据框。
summarise(data,AD=paste(A,D,sep=''),CD=C*100+D,CCD=CD+C)
join
语法:join(data.frameA, data.frameB,
by = [NULL|'col'],
type = ["left"|'right','inner','full'],
match = ["all"|'first'])
类似与SQL语句中的表链接
set.seed(125)
dataA <- data.frame(A = 1:7,
B = sample(letters[1:5],7,replace=TRUE),
D = sample(100)[1:7])
dataB <- data.frame(A1 = 1:5,
B1 = sample(letters[1:5],5,replace=TRUE),
D1 = sample(10)[1:5])
dataC <- data.frame(A = 1:5,
B = sample(letters[1:5],5,replace=TRUE),
D1 = sample(10)[1:5])
join(dataA,dataC,by='A',type='inner') #有相同的列名
join(dataA,dataB) #没有相同的列名
join(dataA,dataB,type='right') #没有相同的列名
match_df
语法:match_df(data.frameA, data.frameB,
on= col)
我叫它数据框匹配函数,用法是可以顾名思义的。
dataA = data.frame(A=c(1,2,1,1,3),
B=c('d','a','c','a','d') )
dataB = data.frame(A=c(3,1,1,2,3),
B=c('d','a','c','a','d') )
#数据框dataA和dataB先按A匹配再按B匹配
match_df(dataA,dataB,on=c('A','B'))
colwise
语法:colwise(.fun, .cols = true, ...) #全部
catcolwise(.fun, ...) #非数值型
numcolwise(.fun, ...) #数值型
用于迭代地对数据框中的每一列运行函数fun
nmissing <- function(x) sum(is.na(x))
colwise(nmissing)(baseball)
numcolwise(nmissing)(baseball)
catcolwise(nmissing)(baseball)
rename
语法:rename(x, replace, warn_missing = TRUE, warn_duplicated = TRUE)
x <- c("a" = 1, "b" = 2, d = 3, 4)
x <- rename(x, replace = c("d" = "c"))
x
round_any
语法:round_any(x, #x为数值变量或时间变量
accuracy
f = [round|floor, ceiling])
直接上代码,简单的函数不需要解释
round_any(135, 10)
round_any(135, 100)
round_any(135, 25)
round_any(135, 10, floor)
round_any(135, 100, floor)
round_any(135, 25, floor)
round_any(135, 10, ceiling)
round_any(135, 100, ceiling)
round_any(135, 25, ceiling)
注:对时间变量的操作似乎并不理想
count
语法:count(data.frame, vars = NULL, wt_var = NULL)
对数据框进行计数操作,类似于table
count(baseball[1:100,], vars = "id")
table(baseball[1:100,]$id)
从结果看,它们的对应值相同但输出形式不同,我更喜欢count的数据框形式,因为数据框可以和ddply系列结合输出更多的信息。
table(baseball[1:50,]$id)
baseball[1:50,]$g
baseball[1:50,]$id
#每个频数对应的数值相加
count(baseball[1:50,], vars = "id", wt_var = "g")
count(baseball[1:20,], c("id", "year"))
#count函数的输出结果为数据框,因此可再次作用于count函数
count(count(baseball[1:20,], c("id", "year")), "id", "freq")