R语言-向量化操作(apply、tapply、lapply、sapply、mapply、table等)

摘要:
tapply()的功能则又有不同,它是专门用来处理分组数据的,其参数要比sapply多一个。headattachtapply示例代码:˃facfac[1]12312312312312312Levels:12345˃tapply12345515745NANA˃tapply$`1`[1]51$`2`[1]57$`3`[1]45$`4`NULL$`5`NULL˃tapply$`1`[1]116$`2`[1]217$`3`[1]315$`4`NULL$`5`NULL#利用tapply实现类似于excel里的数据透视表的功能:˃dayearprovincesale12007A122007B232007C342007D452008A562008C672008D782009B892009C9102009D10˃attach˃tapply[1]1471028116912˃tapplyABCD2007123420085NA672009NA8910三、函数table:使用格式为:table其中参数exclude表示哪些因子不计算。f.data˂-data.framelapply函数sapply是函数lapply的一个特殊情形,对一些参数的值进行了一些限定,其使用格式为:sapplysapply和lapply(*)的返回值是相同的。如果参数simplify=TRUE,则函数sapply的返回值不是一个list,而是一个矩阵;若simplify=FALSE,则函数sapply的返回值仍然是一个list。

一、apply函数(对一个数组按行或者按列进行计算):
使用格式为:
apply(X, MARGIN, FUN, ...)

其中X为一个数组;MARGIN为一个向量(表示要将函数FUN应用到X的行还是列),若为1表示取行,为2表示取列,为c(1,2)表示行、列都计算。apply()函数的处理对象是矩阵或数组,它逐行或逐列的处理数据,其输出的结果将是一个向量或是矩阵。下面的例子即对一个随机矩阵求每一行的均值。要注意的是apply与其它函数不同,它并不能明显改善计算效率,因为它本身内置为循环运算。

示例代码:
> ma <- matrix(c(1:4, 1, 6:8), nrow = 2)
> ma
[,1] [,2] [,3] [,4]
[1,] 1 3 1 7
[2,] 2 4 6 8
> apply(ma, 1, sum)
[1] 12 20
> apply(ma, 2, sum)
[1] 3 7 7 15

二、函数tapply(进行分组统计):
使用格式为:
tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

其中X通常是一向量;INDEX是一个list对象,且该list中的每一个元素都是与X有同样长度的因子;FUN是需要计算的函数;simplify是逻辑变量,若取值为TRUE(默认值),且函数FUN的计算结果总是为一个标量值,那么函数tapply返回一个数组;若取值为FALSE,则函数tapply的返回值为一个list对象。需要注意的是,当第二个参数INDEX不是因子时,函数 tapply() 同样有效,因为必要时 R 会用 as.factor()把参数强制转换成因子。

tapply()的功能则又有不同,它是专门用来处理分组数据的,其参数要比sapply多一个。我们以iris数据集为例,可观察到Species列中存放了三种花的名称,我们的目的是要计算三种花瓣萼片宽度的均值。其输出结果是数组格式。

head(iris)
attach(iris)
tapply(Sepal.Width,INDEX=Species,FUN=mean)

示例代码:
> fac <- factor(rep(1:3, length = 17), levels = 1:5)
> fac
[1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2
Levels: 1 2 3 4 5
> tapply(1:17, fac, sum)
1 2 3 4 5
51 57 45 NA NA
> tapply(1:17, fac, sum, simplify = FALSE)
$`1`
[1] 51
$`2`
[1] 57
$`3`
[1] 45
$`4`
NULL
$`5`
NULL
> tapply(1:17, fac, range)
$`1`
[1] 1 16
$`2`
[1] 2 17
$`3`
[1] 3 15
$`4`
NULL
$`5`
NULL
#利用tapply实现类似于excel里的数据透视表的功能:
> da
year province sale
1 2007 A 1
2 2007 B 2
3 2007 C 3
4 2007 D 4
5 2008 A 5
6 2008 C 6
7 2008 D 7
8 2009 B 8
9 2009 C 9
10 2009 D 10
> attach(da)
> tapply(sale,list(year,province))
[1] 1 4 7 10 2 8 11 6 9 12
> tapply(sale,list(year,province),mean)
A B C D
2007 1 2 3 4
2008 5 NA 6 7
2009 NA 8 9 10
三、函数table(求因子出现的频数):
使用格式为:
table(..., exclude = if (useNA == "no") c(NA, NaN), useNA = c("no",
"ifany", "always"), dnn = list.names(...), deparse.level = 1)
其中参数exclude表示哪些因子不计算。
示例代码:
> d <- factor(rep(c("A","B","C"), 10), levels=c("A","B","C","D","E"))
> d
[1] A B C A B C A B C A B C A B C A B C A B C A B C A B C A B C
Levels: A B C D E
> table(d)
d
A B C D E
10 10 10 0 0
> table(d, exclude="B")
d
A C D E
10 10 0 0

四、函数lapply与函数sapply:
lapply的使用格式为:
lapply(X, FUN, ...)
lapply的返回值是和一个和X有相同的长度的list对象,这个list对象中的每个元素是将函数FUN应用到X的每一个元素。其中X为List对象(该list的每个元素都是一个向量),其他类型的对象会被R通过函数as.list()自动转换为list类型。

lappy()的处理对象是向量、列表或其它对象,它将向量中的每个元素作为参数,输入到处理函数中,最后生成结果的格式为列表。在R中数据框是一种特殊的列表,所以数据框的列也将作为函数的处理对象。下面的例子即对一个数据框按列来计算中位数与标准差。

f.data <- data.frame(x=rnorm(10),y=runif(10))
lapply(f.data,FUN=function(x) list(median=median(x),sd=sd(x)))

函数sapply是函数lapply的一个特殊情形,对一些参数的值进行了一些限定,其使用格式为:
sapply(X, FUN,..., simplify = TRUE, USE.NAMES = TRUE)

sapply(*, simplify = FALSE, USE.NAMES = FALSE) 和lapply(*)的返回值是相同的。如果参数simplify=TRUE,则函数sapply的返回值不是一个list,而是一个矩阵;若simplify=FALSE,则函数sapply的返回值仍然是一个list。

sapply()可能是使用最为频繁的向量化函数了,它和lappy()是非常相似的,但其输出格式则是较为友好的矩阵格式

sapply(f.data,FUN=function(x)list(median=median(x),sd=sd(x)))

示例代码:
> x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
> lapply(x, quantile)
$a
0% 25% 50% 75% 100%
1.00 3.25 5.50 7.75 10.00
$beta
0% 25% 50% 75% 100%
0.04978707 0.25160736 1.00000000 5.05366896 20.08553692
$logic
0% 25% 50% 75% 100%
0.0 0.0 0.5 1.0 1.0
> sapply(x, quantile,simplify=FALSE,use.names=FALSE)
$a
0% 25% 50% 75% 100%
1.00 3.25 5.50 7.75 10.00
$beta
0% 25% 50% 75% 100%
0.04978707 0.25160736 1.00000000 5.05366896 20.08553692
$logic
0% 25% 50% 75% 100%
0.0 0.0 0.5 1.0 1.0
#参数simplify=TRUE的情况
> sapply(x, quantile)
a beta logic
0% 1.00 0.04978707 0.0
25% 3.25 0.25160736 0.0
50% 5.50 1.00000000 0.5
75% 7.75 5.05366896 1.0
100% 10.00 20.08553692 1.0

五、函数mapply:
函数mapply是函数sapply的变形版,mapply 将函数 FUN 依次应用每一个参数的第一个元素、第二个元素、第三个元素上。函数mapply的使用格式如下:
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)
其中参数MoreArgs表示函数FUN的参数列表。
示例代码:
> mapply(rep, times=1:4, x=4:1)
[[1]]
[1] 4
[[2]]
[1] 3 3
[[3]]
[1] 2 2 2
[[4]]
[1] 1 1 1 1
#直接使用函数rep的结果:
> rep(1:4,1:4)

[1] 1 2 2 3 3 3 4 4 4 4

五、replicate()

函数replicate(),它可以将某个函数重复运行N次,常常用来生成较复杂的随机数。下面的例子即先建立一个函数,模拟扔两个骰子的点数之和,然后重复运行10000次。

game <- function() {
n <- sample(1:6,2,replace=T)
return(sum(n))
}
replicate(n=10000,game())

免责声明:文章转载自《R语言-向量化操作(apply、tapply、lapply、sapply、mapply、table等)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇OpenStack各组件的常用命令Visual Studio 2019使用C语言进行websocket编程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ArrayList的使用方法

1、什么是ArrayListArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和IList接口 灵活的设置数组的大小 2、如何使用ArrayList最简单的例子:ArrayListList=newArrayList();for(int...

list 转 map

今天在代码中看到这么一段写法,记录下来。list转map. 1 循环 建一个list 然后循环赋值。 这样,一个key对应一个value. 2Collectors.toMap java8新特性。诸多方法, 这个collectors.map 有三个方法。 参数含义分别是: keyMapper:Key 的映射函数 valueMapper:Value...

SAP系统中发送公告的几种办法

      刚刚在闪存里看到朋友在闪存里提到:如何在SAP系统发送公告的T-CODE,觉得今后可能会用到,所以顺便在网上搜索了一下相关资料。由于时间关系,太晚了,得休息了,在此我就不再一个个抠图了,直接借用一下别人的文章,将此方法记录了下来,希望今后有用得到的地方……     1、SM02创建消息,并设定有效期。当用户刷新窗口或打开窗口时会显示。这个消息对...

R语言-文本挖掘

---恢复内容开始--- 案例1:对主席的新年致辞进行分词,绘制出词云 掌握jieba分词的用法 1.加载包 library(devtools) library(tm) library(jiebaR) library(jiebaRD) library(tmcn) library(NLP)library(wordcloud2) 2.导入数据 new...

Servlet第六篇【Session介绍、API、生命周期、应用】

什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session 如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用...

python(leetcode)-350两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出...