R语言基础之第一部分 5种数据对象类型

R语言基础之第一部分 5种数据对象类型,第1张

前记:

正文:

部分: 5种数据对象类型

11 向量(vector)

12 矩阵(matrix)

向量+维度属性(nrow ncol)

13 数组(array)

与矩阵相似,但维度可大于2(说白了元素都是数 维度随便设)

14 列表(list)

可以包含不同类型

15 因子(factor)

整数向量+标签

16 缺失值(missing value)

NA:各种类型的缺失值

NAN:数值型的缺失值

NAN 属于 NA

isna 和 isnan 判断向量中是否有缺失值

17 数据框(dataframe)

存储表格数据,视为各元素长度相同的 列表

18 日期与时间(date, time)

日期

时间

POSIXct 整数 常用于存入数据框

POSIXIt 列表 还包括年月日等信息

后续请参考:

R语言基础之第 部分 : *** 纵数据 取子集

R语言基础之第 部分:重要函数 apply族函数 的使用

R语言基础之第 部分 : 排序

R语言基础之第 部分 : 总结数据信息

>a <- matrix(c(NA,184,NA,NA,126,NA,275,279),nrow=2,byrow=TRUE)

> a

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

[1,] NA 184 NA NA

[2,] 126 NA 275 279

>a[!isna(a)]

[1] 126 184 275 279

使用isna()函数来判断是否为缺失值,输出非缺失值即可。

之前使用了均值、求和和计数

median()用法和mean()类似,只不过是中位数而已

注:mad()与IQR()基本等价,但是IQR()更适合有离群点的情况。

这三个函数的作用相当于x[1]、x[2]、x[length(x)]

通过此函数也可以找出最早和最晚出发的航班

n():不需要任何参数,返回当前分组的大小

sum(!isna(x)):计算非缺失值的数量

n_distinct(x):计算唯一值的数量

count()函数:用于只需要计数的情况

例如:

计算哪个目的地有最多的航空公司?

count()函数用法举例:计算目的地不同的飞机数量

count()函数中可以添加加权变量,例如distance,用于计算飞机飞行里程(相当于求和)

以下一例:找出出发时间小于5:00的航班总数

以下一例:找出延误超过一小时的航班比例

输入了函数对象名称,可以直接看到代码的,如要获得函数对象fivenum的代码,就只需要在Console中键入函数对象名称fivenum就可以得到如下结果:

function (x, narm = TRUE)

{

xna <- isna(x)

if (narm)

x <- x[!xna]

else if (any(xna))

return(repint(NA, 5))

x <- sort(x)

n <- length(x)

if (n == 0)

repint(NA, 5)

else {

n4 <- floor((n + 3)/2)/2

d <- c(1, n4, (n + 1)/2, n + 1 - n4, n)

05 (x[floor(d)] + x[ceiling(d)])

}

}

R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能。但是初学者往往认为编写R函数十分困难,或者难以理解。这里对如何编写R函数进行简要的介绍。

函数是对一些程序语句的封装。换句话说,编写函数,可以减少人们对重复代码书写,从而让R脚本程序更为简洁,高效。同时也增加了可读性。一个函数往往完成一项特定的功能。例如,求标准差sd,求平均值,求生物多样性指数等。R数据分析,就是依靠调用各种函数来完成的。但是编写函数也不是轻而易举就能完成的,需要首先经过大量的编程训练。特别是对R中数据的类型,逻辑判别、下标、循环等内容有一定了解之后,才好开始编写函数。 对于初学者来说,最好的方法就是研究现有的R函数。因为R程序包都是开源的,所有代码可见。研究现有的R函数能够使编程水平迅速提高。

R函数无需首先声明变量的类型,大部分情况下不需要进行初始化。一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分。

函数名称,即要编写的函数名称,这一名称就作为将来调用R函数的依据。

2 函数声明,包括 <- function, 即声明该对象的类型为函数。

3 函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个对象。函数参数所等于的数据,就是在函数体内部将要处理的值,或者对应的数据类型。 函数体内部的程序语句进行数据处理,就是对参数的值进行处理 ,这种处理只在调用函数的时候才会发生。函数的参数可以有多种类型。R help的界面对每个函数,及其参数的意义及所需的数据类型都进行了说明。

4 函数体

常常包括三部分

(1) 异常处理

输入的数据不能满足函数计算的要求,或者类型不符, 这时候一定要设计相应的机制告诉用户,输入的数据在什么地方有错误。 错误又分为两种。

第一种, 如果输入的数据错误不是很严重,可以经过转换,变为符合处理要求的数据时, 此时只需要给用户一个提醒,告知数据类型不符,但是函数本身已经 进行了相应的转换。

第二种,数据完全不符合要求,这种情况下,就 要终止函数的运行,而告知因为什么,函数不能运行。这样,用户在 使用函数的情况先才不至于茫然。

(2) 运算过程

包括具体的运算步骤。 运算过程和该函数要完成的功能有关。

R运算过程中,应该尽量减少循环的使用,特别是嵌套循环。R提供了 apply,replicate等一系列函数,来代替循环,应该尽量应用这些函数, 提高效率。 如果在R中实在太慢,那么核心部分只能依靠C或者Fortran 等语言编写,然后再用R调用这些编译好的模块,达到更高的效率。

运算过程中,需要大量用到if等条件作为判别的标准。if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如 isna, ismatrix, isnumeric等等,或者对大小的比较,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的。

例子:

## if与条件判断

funtest <- function(a, b, method = "add"){

if(method == "add") { ## 如果if或者for/while;

res <- a + b ## 等后面的语句只有一行,则无需使用花括号。

}

if(method == "subtract"){

res <- a - b

}

return(res) ## 返回值

}

### 检验结果

funtest(a = 10, b = 8, method = "add")

funtest(a = 10, b = 8, method = "substract")

好像也有没类似的针对列表的存储方法,特别是各列长度不一致或者各列对象不一致的情况;

只能用比较土的字符串处理方法:

求出列长度最大的值存储为RowNumsmax

按最大行值RowNumsmax遍历取各列,进行字符串拼接;

使用isna函数判断值是否为空,为空使用“”拼接,不为空使用元素值拼接;

每行遍历完,加“\n”拼接。

使用writeLines函数将字第串存储为TXT文件。

不知道其他人有什么好方法分享出来 。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/13496245.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存