• R语言基础


    A. 处理循环

      - R不仅有for/while循环语句,还有更强大的实现循环的"一句话"函数

    B. 排序

    C. 总结数据信息

    1. lapply:可以循环处理列表中的每一个元素,总是返回一个列表

      - lapply(列表,函数/函数名,其他参数)

      - sapply:简化结果

        a. 结果列表元素长度均为1,返回向量

        b. 结果列表元素长度相同且大于1,返回矩阵

    # lapply
    
    str(lapply)
    
    x <- list(a=1:10, b=c(11,21,31,41,51))
    lapply(x, mean)  # 计算每个列表的平均值
    
    x <- 1:4
    lapply(x, runif)  # 从一个均匀分布的0到1里抽取若干个数出来
    lapply(x, runif, min=0, max=100)  # 从一个均匀分布的0到100里抽取若干个数出来
    
    x <- list(a=matrix(1:6,2,3), b=matrix(4:7,2,2))
    lapply(x, function(m) m[1,])  # 取出每个矩阵的第一行
    
    # sapply
    x <- list(a=1:10, b=c(11,21,31,41,51))
    lapply(x, mean)
    sapply(x, mean)  # 返回结果从列表简化为向量  

    2. apply:沿着数组的某一维度处理数据

      - 例如,将函数用于矩阵的行或列

      - 虽然与for/while循环的效率相似,但是只用一句话就可以完成

      - apply(数组,维度,函数/函数名)

    # apply
    
    x <- matrix(1:16, 4, 4)
    
    apply(x, 2, mean)  # 1维度为行,2维度为列
    apply(x, 2, sum)
    
    apply(x, 1, sum)
    apply(x, 1, mean)
    
    rowSums(x) # 行和
    rowMeans(x) # 行平均
    colSums(x) # 列和
    colMeans(x) # 列平均
    
    x <- matrix(rnorm(100), 10, 10) 
    # 从正态分布里随机抽取100个数据,组成一个10*10的矩阵
    apply(x, 1, quantile, probs=c(0.25, 0.75)) 
    # quantile求数据的百分位点
    # probs表示求25%和75%对应百分位点的数据
    
    x <- array(rnorm(2*3*4), c(2,3,4))
    # 第一维度是2,第二维度是3,第三维度是4
    apply(x,c(1,2),mean) # 在第一维和第二维组成的平面上,沿着第三维求平均
    apply(x,c(1,3),mean) # 在第一维和第三维组成的平面上,沿着第二维求平均
    apply(x,c(2,3),mean) # 在第二维和第三维组成的平面上,沿着第一维求平均

    3. mapply:lapply的多元版本

      - mapply(函数/函数名,数据,函数相关的参数)

    # mapply
    
    list(rep(1,4),rep(2,3),rep(3,2),rep(4,1))
    
    mapply(rep, 1:4, 4:1) # 函数名,数据,重复次数
    
    s <- function(n, mean, std){
      rnorm(n, mean, std)
    } 
    # 从正态分布中要抽取的个数,随机分布的总体的均值,随机分布对应的标准差
    
    s(4,0,1) # 抽取n个数据,均值为mean,标准差为std
    
    mapply(s, 1:5, 5:1, 2)
    list(s(1,5,2),s(2,4,2),s(3,3,2),s(4,2,2),s(5,1,2))

    4. tapply:对向量的子集进行操作

      - tapply(向量,因子/因子列表,函数/函数名)

    # tapply
    
    x <- c(rnorm(5), runif(5), rnorm(5,1))
    # 正态分布的5个值,均匀分布的5个值,mean为1且std为0的正态分布的5个值
    f <- gl(3, 5) # 3个水平,每水平下5个元素
    
    tapply(x, f, mean) # 对x向量,按照因子的水平进行分组,对每一组求均值
    tapply(x, f, mean, simplify=FALSE)

    5. split:根据因子或因子列表将向量或其他对象分组,通常与lapply一起使用

      - split(向量/列表/数据框,因子/因子列表)

    # split
    
    x <- c(rnorm(5), runif(5), rnorm(5,1))
    f <- gl(3, 5)
    split(x, f) # 对x向量,按照因子的水平进行分组
    
    lapply(split(x, f), mean)
    
    head(airquality)
    s <- split(airquality, airquality$Month)
    
    table(airquality$Month)
    
    lapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")],na.rm=TRUE))
    sapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")]))
    sapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")],na.rm=TRUE))

    6. 排序

      - sort:对向量进行排序;返回排好序的内容

      - order:返回排好序的内容的下标 / 多个排序标准

    # sort and order
    
    x <- data.frame(v1=1:5, v2=c(10,7,9,6,8), v3=11:15, v4=c(1,1,2,2,1))
    
    sort(x$v2)
    sort(x$v2, decreasing=TRUE)
    
    order(x$v2)
    x[order(x$v2),]
    
    x[order(x$v4,x$v2),]
    x[order(x$v4,x$v2,decreasing=TRUE),]

    7. 总结数据信息

    # summarize data
    
    head(airquality)
    tail(airquality, 2)
    
    summary(airquality)
    str(airquality)
    
    table(airquality$Month)
    table(airquality$Ozone)
    table(airquality$Ozone, useNA="ifany")
    table(airquality$Month, airquality$Day)
    
    any(is.na(airquality$Ozone))
    sum(is.na(airquality$Ozone))
    
    all(airquality$Month<12)
    
    titanic <- as.data.frame(Titanic)
    head(titanic)
    dim(titanic)
    summary(titanic)
    
    x <- xtabs(Freq ~ Class + Age, data=titanic)
    ftable(x)
    
    object.size(airquality)
    print(object.size(airquality), units='Kb')

    8. 小结

      

  • 相关阅读:
    转:JMeter5的If Controller操作解析
    .NET Core优秀的应用逻辑分层框架设计
    socket阻塞导致拿不到信息
    2018年开始了,我们还是说说2017吧
    PHP 学习 遇到坑的第一章
    记一次高并发情况,服务器和代码修改过程记录。
    IIS 提高连接的并发数,和CPU的使用率。
    2017年总结
    在 safari 浏览器 onclick 出现延迟的现象
    微信JS-api 注意事项
  • 原文地址:https://www.cnblogs.com/wnzhong/p/6420058.html
Copyright © 2020-2023  润新知