zoukankan      html  css  js  c++  java
  • plyr包使用

    #--------------------------------
    #  plyr包使用
    # 建议直接保存为R文件到Rstudio中运行 #
    -------------------------------- #-------------1.传统apply函数与plyr比较 library(tidyr) library(plyr) head(iris) long.iris <- stack(iris, select=-Species)#stack宽数据库转换长数据,unstack相反 long.iris <- data.frame( long.iris, Species=rep( iris[['Species']], 4 ) ) colnames(long.iris) #不同物种的不同属性的最大和最小值,使用tapply函数结果是list tapply( long.iris$values, INDEX=paste( long.iris$Species, long.iris$ind, sep='.' ), function(x) {c(max(x), min(x))} ) #使用 plyr 包中的 ddply 得到数据框格式 ddply( long.iris, .(Species, ind), function(x) {c(max(x$values), min(x$values))} ) #--------2.plyr中的apply函数组合 #输入结构有array(a),list(l),data.frame(d)三种,输出结构有a,l,d,-(空,即不输出)四种,共12种组合函数 #------a*ply: aaply,adply,alply,a_ply #a*ply(.data, .margins, .fun, ..., .progress='none') #.data数组,.margins向量形式(包含要考虑的维度,即行维和列维),.fun为行或列维指定需要处理的函数,.progress显示进度条的方式 a <- array(rnorm(27), c(3, 3, 3));a adply(a, c(1, 2), mean) #三维数组需要对前两维进行计算,.fun 则需根据所输入的数组和选用的 margin 进行匹配。 aaply(a, c(1), class) aaply(a, c(1, 2), class) #选择其中一个维度进行分组, .fun 则应该是对二维数组, 即矩阵的操作。 a <- array(data = 1:500,dim = c(100,5));a #对每一行求均值 test1 <- aaply(.data = a,.margins = 1,.fun = mean,.progress = "none") test1 # 对每一行求标准差,以文本的形式显示进度条 test2 <- adply(.data = a,.margins = 1,.fun = sd,.progress = "text") test2 #------d*ply: daply,ddply,dlply,d_ply #d*ply(.data, .variables, .fun, ..., .progress='none') #.data数据框,.variables向量形式(包含要考虑的列名,即分组变量),.fun基于分组变量对数据框中的其余变量指定某种函数 daply( long.iris, c('Species', 'ind'), function(x) {c(max(x$values), min(x$values))} ) #对于ddply函数,.fun 所接受的函数是和输入数据表同样的列数而不同行数的数据表进行操作的函数 dim(long.iris) #三列600行 ddply( long.iris, .(Species, ind), function(x) {c(class(x), dim(x))} ) 50 * 12 fun <- function(data) apply(data,2,mean) daply(.data = iris[,1:4],.variables = .(iris$Species),.fun = fun) ddply(.data = iris[,1:4],.variables = .(iris$Species),.fun = fun) dlply(.data = iris[,1:4],.variables = .(iris$Species),.fun = fun) #------l*ply:laply,ldply,llply,l_ply #l*ply(.data, .fun, ..., .progress='none') llply(long.iris, unique) # 向量列表 x1 <- 1:100 x2 <- seq(from = 100,to = 1000,by = 2) x3 <- runif(150,min = 10,max = 100) l1 <- list(x1 = x1,x2 = x2,x3 = x3);l1 laply(.data = l1,.fun = mean) ldply(.data = l1,.fun = summary) llply(.data = l1,.fun = quantile) l_ply(.data = l1,.fun = summary) #数据框列表 y11 <- rnorm(n = 100,mean = 10,sd = 5) y12 <- rt(n = 100,df = 3) y13 <- rf(n = 100,df1 = 2,df2 = 3) y14 <- factor(x = c("low","potential","high"),ordered = T) y15 <- sample(y14,size = 100,replace = TRUE) d11 <- data.frame(y1 = y11,y2 = y12,y3 = y13,y5 = y15) head(d11) y21 <- 1:100 y22 <- seq(from = 1,to = 2,length = 100) y23 <- rchisq(n = 100,df = 8) y24 <- factor(x = c("A","B","C","D"),order = T) y25 <- sample(y24,size = 100,replace = TRUE) d21 <- data.frame(y21 = y21,y22 = y22,y23 = y23,y25 = y25) head(d21) l2 <- list(first = d11,second = d21);str(l2) library(psych) fun <- function(data) describeBy(data[,1:3],group = data[,4])#分组统计 llply(.data = l2,.fun = fun,.progress = "none") llply(.data = l2,.fun = fun,.progress = "text") #-------m*ply: maply,mdply,mlply,m_ply #m*ply(.data, .fun, ..., .progress='none') m表矩阵或数据框 b <- data.frame( n=c(5, 5, 5), mean=c(1, 20, 300), sd=c(1, 20, 300) );b mdply(b, rnorm) #------------总结 #对于 a*ply, d*ply, 和 l*ply 函数重要的区别在于如何确定分组: #a*ply 函数是根据 .margins 指定的输入数组的维度的值进行分组计算, #d*ply 函数是根据 .variables 指定的列名进行分组计算, #l*ply 函数类似于 lapply 对列表的每一个元素进行计算。 Ref: https://zhuanlan.zhihu.com/p/29252477 https://www.cnblogs.com/awishfullyway/p/6485250.html
  • 相关阅读:
    Axure RP
    简单实现SSO
    php Header 函数使用
    使用 PHP SOAP 来创建一个简单的 Web Service。
    简单 php 代码跟踪调试实现
    js打开新窗口,打开新窗口屏蔽工具栏和地址栏,窗口按规定大小显示
    PHP 面向切面编程
    Shell 简单构建 Node web服务器
    thinkphp 迁移数据库 -Phinx 简单说明文档
    magento 2 method config
  • 原文地址:https://www.cnblogs.com/jessepeng/p/9970037.html
Copyright © 2011-2022 走看看