R编程之路_数据汇总(2)

简介: R编程之路_数据汇总(2)

1、apply函数:

这个函数的使用格式为:apply(X,MARGIN, FUN, ...)。它应用的数据类型是数组或矩阵,返回值类型由FUN函数结果的长度确定。

X参数为数组或矩阵;MARGIN为要应用计算函数的边/维,MARGIN=1为第一维(行),2为第二维(列),...;FUN为要应用的计算函数,后面可以加FUN的有名参数。比如,要按行或列计算数组a的标准差就可以这样:

1.  > apply(a, MARGIN=1, FUN=sd)

2.  [1] 1 1 1

3.  > apply(a, MARGIN=2, FUN=sd)

4.  [1] 0 0 0

MARGIN的长度可以不是1(多维应用),如果长度等于X的维数,应用到FUN函数的数据就只有一个值,结果没什么意义,甚至函数会获得无效值:

1.  > apply(b, MARGIN=3, FUN=sum)

2.  [1]  9 18 27

3.  > apply(b, MARGIN=1:2, FUN=sum)

4.       [,1] [,2] [,3]

5.  [1,]    6    6    6

6.  [2,]    6    6    6

7.  [3,]    6    6    6

8.  > apply(a, MARGIN=1:2, FUN=sd)

9.       [,1] [,2] [,3]

10.[1,]   NA   NA   NA

11.[2,]   NA   NA   NA

12.[3,]   NA   NA   NA

上面我们使用的sd、sum或mean函数的返回值的向量长度都是1(每一次单独计算),apply函数结果的维数与MARGIN的向量长度相同;如果FUN函数返回值的长度不是1而是每次都为n,apply函数的结果是维度为c(n, dim(X)[MARGIN]):

1.  > a

2.       [,1] [,2] [,3]

3.  [1,]    1    2    3

4.  [2,]    1    2    3

5.  [3,]    1    2    3

6.  > apply(a, MARGIN=1, FUN=quantile, probs=seq(0,1, 0.25))

7.       [,1] [,2] [,3]

8.  0%    1.0  1.0  1.0

9.  25%   1.5  1.5  1.5

10.50%   2.0  2.0  2.0

11.75%   2.5  2.5  2.5

12.100%  3.0  3.0  3.0

13.> apply(a, MARGIN=2, FUN=quantile, probs=seq(0,1, 0.25))

14.     [,1] [,2] [,3]

15.0%      1    2    3

16.25%     1    2    3

17.50%     1    2    3

18.75%     1    2    3

19.100%    1    2    3

如果FUN函数返回值的长度不一样,情况就复杂了,apply函数的结果会是列表。

2、lapply、sapply和vapply函数:

这几个函数是一套,前两个参数都为X和FUN,其他参数在R的函数帮助文档里有相信介绍。它们应用的数据类型都是列表,对每一个列表元素应用FUN函数,但返回值类型不大一样。lappy是最基本的原型函数,sapply和vapply都是lapply的改进版。

2.1  lapply返回的结果为列表,长度与X相同

1.  > scores <- list(YuWen=c(80,88,94,70), ShuXue=c(99,87,100,68,77))

2.  > lapply(scores, mean)

3.  $YuWen

4.  [1] 83

5.    

6.  $ShuXue

7.  [1] 86.2

8.    

9.  > lapply(scores, quantile, probs=c(0.5,0.7,0.9))

10.$YuWen

11. 50%  70%  90%  

12.84.0 88.6 92.2  

13.  

14.$ShuXue

15. 50%  70%  90%  

16.87.0 96.6 99.6

2.2  sapply返回的结果比较“友好”,如果结果很整齐,就会得到向量或矩阵或数组

sapply是simplify了的lapply,所谓的simplify,是指对结果的数据结构进行了simplify,方便后续处理。

1.  > sapply(scores, mean)

2.   YuWen ShuXue  

3.    83.0   86.2  

4.  > sapply(scores, quantile, probs=c(0.5,0.7,0.9))

5.      YuWen ShuXue

6.  50%  84.0   87.0

7.  70%  88.6   96.6

8.  90%  92.2   99.6

2.3  vapply函数:对返回结果(value)进行类型检查的sapply

虽然sapply的返回值比lapply好多了,但可预测性还是不好,如果是大规模的数据处理,后续的类型判断工作会很麻烦而且很费时。vapply增加的FUN.VALUE参数可以直接对返回值类型进行检查,这样的好处是不仅运算速度快,而且程序运算更安全(因为结果可控)。下面代码的rt.value变量设置返回值长度和类型,如果FUN函数获得的结果和rt.value设置的不一致(长度和类型)都会出错:

 

1.  > probs <- c(1:3/4)

2.  > rt.value <- c(0,0,0)  #设置返回值为3个数字 

3.  > vapply(scores, quantile, FUN.VALUE=rt.value, probsprobs=probs)

4.      YuWen ShuXue

5.  25%  77.5     77

6.  50%  84.0     87

7.  75%  89.5     99

8.  > probs <- c(1:4/4)

9.  > vapply(scores, quantile, FUN.VALUE=rt.value, probsprobs=probs)

错误于vapply(scores,quantile, FUN.VALUE = rt.value, probs = probs) :

值的长度必需为3,

但FUN(X[[1]])结果的长度却是4

1.  > rt.value <- c(0,0,0,0)   #返回值类型为4个数字 

2.  > vapply(scores, quantile, FUN.VALUE=rt.value, probsprobs=probs)

3.       YuWen ShuXue

4.  25%   77.5     77

5.  50%   84.0     87

6.  75%   89.5     99

7.  100%  94.0    100

8.  > rt.value <- c(0,0,0,'')  #设置返回值为3个数字和1个字符串 

9.  > vapply(scores, quantile, FUN.VALUE=rt.value, probsprobs=probs)

错误于vapply(scores,quantile, FUN.VALUE = rt.value, probs = probs) :

值的种类必需是'character',

但FUN(X[[1]])结果的种类却是'double'

FUN.VALUE为必需参数。

相关文章
Flutter笔记:电商中文货币显示插件Money Display
实战中的电商应用货币显示有一些繁琐,比如需要在数字中插入逗号分隔符、需要判断金额数量级,为大的数量级添加单位(比如超过10000时添加万字),处理超出最大金额显示,考虑数位的保留,处理小数点后多余的0,等等。为此我做了一个小模块,用于自动处理这些问题,没有特殊需求的情况下,可以仅仅传入一个double数。如果有需要,你可以通过考虑传入不同参数以指定更多的样式。
310 0
|
4月前
|
存储 缓存 网络协议
移动端弱网优化专题(十五):字节跳动移动端网络HttpDNS优化实践
本文要分享的是字节跳动团队针对火山HTTPDNS Cache2.0通过自研网段库与动态划分算法,将缓存粒度从“城市-运营商”细化为“网段”,解决了传统方案的城市级调度污染问题。配合缓存分级、预取等优化,在提升调度精准度的同时保证了高命中率,最终实现了服务端调度准确性提升和客户端性能优化。
296 1
|
存储 关系型数据库 MySQL
MySQL主键谁与争锋:MySQL为何钟爱自增主键ID+UUID?
本文深入探讨了在MySQL中使用自增类型主键的优势与局限性。自增主键通过保证数据的有序性和减少索引维护成本,提升了查询和插入性能,简化了数据库管理和维护,并提高了数据一致性。然而,在某些业务场景下,如跨表唯一性需求或分布式系统中,自增主键可能无法满足要求,且存在主键值易预测的安全风险。因此,选择主键类型时需综合考虑业务需求和应用场景。
516 2
|
搜索推荐 安全 数据挖掘
如何利用商品详情数据挖掘消费者的潜在需求?
本文介绍了利用商品详情数据挖掘消费者潜在需求的六种方法,包括分析商品属性信息、研究消费者评价反馈、关注搜索浏览行为、对比竞争对手数据、分析购买行为及利用数据挖掘技术进行综合分析,旨在帮助企业精准捕捉市场需求,优化产品和服务。
|
Ubuntu 开发工具 git
Ubuntu编译ffmpeg解决错误:ERROR: avisynth/avisynth_c.h not found
通过本文的详细指导,您可以顺利地在Ubuntu系统上配置和编译FFmpeg,并解决Avisynth头文件缺失的问题。
616 27
|
数据采集 监控 安全
量化交易源码开发丨量化交易系统开发成熟技术/教程方案/策略指南
定你的量化交易系统的需求和目标,包括交易策略、数据来源、风险管理等。
|
存储 SQL 关系型数据库
MySQL事务日志奥秘:undo log大揭秘,一文让你彻底解锁!
【8月更文挑战第24天】本文深入探讨了MySQL中undo log的关键作用及其在确保事务原子性和一致性方面的机制。MySQL通过记录事务前的数据状态,在需要时能回滚至初始状态。主要介绍InnoDB存储引擎下的undo log实现,包括undo segment和record的结构,而MyISAM则采用redo log保障持久性而非一致性。通过一个简单的SQL回滚示例,展示了undo log如何在实际操作中发挥作用,帮助读者更好地理解并运用MySQL事务管理功能。
857 0
|
缓存 监控 前端开发
如何优化 Python WEB 应用程序的性能?
【2月更文挑战第27天】【2月更文挑战第93篇】如何优化 Python WEB 应用程序的性能?
390 0
|
XML Java 应用服务中间件
# 如何 在同一个 服务器上同时部署 nginx 以及 tomcat
# 如何 在同一个 服务器上同时部署 nginx 以及 tomcat
592 0
|
设计模式 Java 应用服务中间件
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
645 0

热门文章

最新文章