R语言基础教程第3章数据结构综合运用

数据结构综合运用

1向量化运算符

在之前R语言基础教程——第3章:数据结构——向量中我们介绍过向量的加减乘除运算,在这里介绍一下,运算。

x=c(88,5,12,13)y=c(98,3,14,9)z=c(90,12,34,45,5,3)xy[1]FALSETRUEFALSETRUExy[1]TRUEFALSETRUEFALSExz[1]FALSEFALSEFALSEFALSETRUETRUEWarningmessage:Inxz:长的对象长度不是短的对象长度的整倍数b=c(99,3,15,6,14,56,45,12)x=b[1]FALSETRUEFALSETRUETRUEFALSEFALSETRUE

如果2个向量长度相等,可以用或来判断向量中对应元素的大小关系,判断正确为TRUE,否则FALSE。如果长度不相等,也会判断,但会提示警告:长的对象长度不是短的对象长度的整倍数,如果是整数倍不会提示,需要注意。

在这里需要说明的是,xy运算过程中,x[1]与y[1]运算得FALSE,x[2]与y[2]运算得TRUE,以此类推,得到的所有结果最后还是一个向量。关键在于一个函数使用了向量化的运算符,那么它也被向量化了。这对运算速度有很大的提升。

2向量输入,矩阵输出

vector=1:20matrix1=matrix(vector,ncol=4)vector[1]matrix1[,1][,2][,3][,4][1,][2,][3,][4,][5,]NA和NULL值

在我们获取的实验数据中,有时候会有缺失值,也就是NA。

age=c(23,34,NA,24,38,34,28,30)age[1]NAmean(age)[1]NAmean(age,na.rm=T)[1]30.age2=c(23,34,NULL,24,38,34,28,30)mean(age2)[1]30.

如果数据中用NA值,那么在进行相应的运算时会出错,可通过na.rm=T(意思为移除NA)声明,计算其余的值,而对于NULL,R会自动跳过。

NA和NULL是有区别的,NA会被当成一个元素,NULL是当成不存在的。

age=c(23,34,NA,24,38,34,28,30)age2=c(23,34,NULL,24,38,34,28,30)length(age)[1]8length(age2)[1]7

这在矩阵,数据框中的性质是一样的

matrix1[,1][,2][,3][,4][1,][2,][3,][4,][5,]matrix1[1,3]=NAmatrix1[,1][,2][,3][,4][1,]16NA16[2,][3,][4,][5,]mean(matrix1)[1]NAdata=as.data.frame(matrix1)#将矩阵转化为数据框dataV1V2V3VNA162345mean(data)[1]NAWarningmessage:Inmean.default(data):参数不是数值也不是逻辑值:回覆NAmean(data[4,4])[1]筛选

如果要要从大量数据中找出符合一定要求的数据,就得用到R中的筛选功能。

a=c(1:10)w=a[a5]#获取a中大于5的元素w[1]

我们对向量a使用了符号,也发生了向量化。这与使用a[c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE)]是一样的结果。

a5[1]FALSEFALSEFALSEFALSEFALSETRUETRUETRUETRUETRUEa[c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE)][1]

除了上面这种方式以外,我们还可以通过函数获取。

a[1]5subset(a,a5)[1]

subset()函数获取子集时会忽略NA值。而之前通过索引获取时NA值不会被忽略。

aa=c(2,4,3,6,2,5,8,NA,9,2,4,4,5)aa*aa10#[1]FALSETRUEFALSETRUEFALSETRUETRUENATRUEFALSETRUETRUE[13]TRUEaa[aa*aa10][1]NAsubset(aa,aa*aa10)[1]

这些是直接获取元素的值,倘若我们要获取元素的位置,可以使用which()函数。which()函数统一会忽略NA值。

which(aa5)[1]

注意在矩阵和数据框中的使用。

matrix1[,1][,2][,3][,4][1,]16NA16[2,][3,][4,][5,]subset(matrix1,matrix13)#subset函数不能直接用于矩阵Errorinx[subset!is.na(subset),vars,drop=drop]:(下标)逻辑下标太长subset(matrix1[,1],matrix1[,1]3)#指定特定的行或列可以用subset[1]45dataV1V2V3VNA162345data3V1V2V3V4[1,]FALSETRUENATRUE[2,]FALSETRUETRUETRUE[3,]FALSETRUETRUETRUE[4,]TRUETRUETRUETRUE[5,]TRUETRUETRUETRUEdata[data3][1]45NA12131415161which(matrix14)[1]512131415161which(data5)[1]121314151615apply()函数的运用

apply(matrix,dimcode=1,f,fargs)。matrix是一个矩阵,dimcode=1表示按行运用函数,=2表示按列运用函数。

matrix1[,1][,2][,3][,4][1,]16NA16[2,][3,][4,][5,]apply(matrix1,2,mean)#按列求均值[1]38NA18f=function(x)x/2#定义一个函数y=apply(matrix1,1,f)y[,1][,2][,3][,4][,5][1,]0.51.01.52.02.5[2,]3.03.54.04.55.0[3,]NA6.06.57.07.5[4,]8.08.59.09..0

matrix1是一个5行4列是矩阵,运用f函数以后发现变成了一个4行5列的矩阵,这是apply函数的默认方式,可用转置函数t()进行转换。

t(y)[,1][,2][,3][,4][1,]0.53.0NA8.0[2,]1.03.56.08.5[3,]1.54.06.59.0[4,]2.04.57.09.5[5,]2.55.07..0

apply函数用于矩阵,lapply()和sapply()用于列表,lapply()返回一个列表,sapply()返回一个向量。

lapply(list(1:3,25:29),median)[[1]][1]2[[2]][1]27sapply(list(1:3,25:29),median)[1]数据的合并

rbind()和cbind()函数可用于合并数据框或者矩阵的数据。合并数据要求数据具有相同的行或者列。

m=matrix(1:8,nrow=4)m[,1][,2][1,]15[2,]26[3,]37[4,]48mf=data.frame(a=1:5,b=6:10)mfab5cbind(m,9:12)[,1][,2][,3][1,][2,][3,][4,]cbind(mf,c=11:15)abc81344914515rbind(m,1:2)[,1][,2][1,]15[2,]26[3,]37[4,]48[5,]12rbind(mf,c(66,67))ab5666677tapply()函数

ages=c(25,26,55,37,31,42)affils=c("R","D","D","R","U","D")tapply(ages,affils,mean)DRU

函数tapply()把向量c("R","D","D","R","U","D")作为具有水平"D","R","U"的因子。

8split()函数

g=c("M","F","F","I","M","M","F")split(1:7,g)$F[1]$I[1]4$M[1]向量g作为因子有三个水平M,F,I,对应到第一水平的索引值为1,5,6,意味着g[1]、g[5]和g[6]具有值"M"。因此输出结果中组件M为向量1:7中的第1,5,6位元素,即c(1,5,6)。9by()函数

by(data,INDICES,FUN,...,simplify=TRUE)data通常是一个数据库,也可以是一矩阵。INDICES是一个因子或一组因子,每个因子的长度为nrow(数据)。FUN是要应用于(通常是数据框)data子集的函数。

require(stats)by(warpbreaks[,1:2],warpbreaks[,"tension"],summary)by(warpbreaks[,1],warpbreaks[,-1],summary)by(warpbreaks,warpbreaks[,"tension"],function(x)lm(breaks~wool,data=x))##nowsupposewewanttoextractthecoefficientsbygrouptmp-with(warpbreaks,by(warpbreaks,tension,function(x)lm(breaks~wool,data=x)))sapply(tmp,coef)aggregate()与cut()函数自学。DoubleHelix

您的赞赏是我发布优质内容的动力









































治疗白癜风最新方法
白癜风根治



转载请注明:http://www.92nongye.com/hxjs/hxjs/204621732.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了