R语言plyr包学**

时间:2022-09-07 11:57:28

今天介绍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))

R语言plyr包学**

mutate

语法:mutate(data.frame,newcolname=expression(oldcolname))

用于对数据框中的列进行某种函数运算生成新列。

mutate(data,AD=paste(A,D,sep=''),CD=C*100+D,CCD=CD+C)

R语言plyr包学**
mutate在某种程度上可以看成是transform的升级版,运行速度比transform快的多

# mutate 比 transform 快的多

system.time(transform(baseball, avg_ab = ab / g))

system.time(mutate(baseball, avg_ab = ab / g))

R语言plyr包学**

summarise

语法:summarise(data.frame,newcolname=expression(oldcolname))

类似与mutate,但创造新的数据框。

summarise(data,AD=paste(A,D,sep=''),CD=C*100+D,CCD=CD+C)

R语言plyr包学**

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')        #没有相同的列名

R语言plyr包学**

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'))

R语言plyr包学**

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)

R语言plyr包学**


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

R语言plyr包学**

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)

R语言plyr包学**
从结果看,它们的对应值相同但输出形式不同,我更喜欢count的数据框形式,因为数据框可以和ddply系列结合输出更多的信息。

table(baseball[1:50,]$id)

baseball[1:50,]$g

baseball[1:50,]$id

#每个频数对应的数值相加

count(baseball[1:50,], vars = "id", wt_var = "g")

R语言plyr包学**

count(baseball[1:20,], c("id", "year"))

#count函数的输出结果为数据框,因此可再次作用于count函数

count(count(baseball[1:20,], c("id", "year")), "id", "freq")

R语言plyr包学**