r语言dmy()函数转化出现na_R语言日积月累基础篇(一)

7f4b0e56969cf499388de244d53644fa.png

向量

R语言是向量化编程,基本类型(atomic)是向量类型,包括一些内置函数都是向量化操作,是对每个元素进行运算的,如基本的加法运算:如果两个向量长度相等,则对应元素相加,如果不等,则短的元素向长的补齐

> x1 <- c(1,2,3)
> x2 <- c(2,3,4)
> x1 + x2
[1] 3 5 7
> x3 <- c(4,5,6)
> x3 <- c(4,5,6,6)
> x3 + x1 #如果长向量长度不是短向量的长度,则会发出警告消息
[1] 5 7 9 7
Warning message:
In x3 + x1 :
  longer object length is not a multiple of shorter object length
> x3 <- c(4,5,6,6,6,6)
> x3 + x1#如果长向量长度是短向量的长度整数倍
[1] 5 7 9 7 8 9

其他数据类型都是在向量基础上衍生出来的,比向量多了几个属性,如矩阵多了dim属性

一、创建向量及其op:

#生成向量
x <- c(1,2,3)

> y <- NULL
> y[1] <- 10
> y[2] <- 20
> y
[1] 10 20

NA值和NA值是不同的,NULL值是不存在,常用于节省内存生成向量,NA是值存在,但是不知道是多少,一般很多函数的操作对象有NA值时都无法运算,需要提供参数选项忽略掉这些NA值

向量常用的一些函数:不懂的函数可以用help(函数名)or ?函数名 查看帮助文档

#获取向量长度
> length(x)
[1] 3
#向量的索引,切片,x[],[]内部
可以是start:stop切片,不同于python,R语言下标起始于1,且切片包括最后一个元素:
> y <- c(1,10,20,5,45,23)
> y[1:3]
[1]  1 10 20
:这个也可以直接用来生成向量:
> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10
也可以是一个表示索引的向量:索引可以重复
> y[c(1,1,2,4)]
[1]  1  1 10  5
不同于python,负数索引表示从列表的末尾开始,而R中负数索引代表排除这个索引对应的元素在外
> y[-c(1,1,2,4)]
[1] 20 45 23

#seq函数
> seq(12,30)
 [1] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
这里还有很多参数,如by表示间隔
#seq函数还有一个用处,如果直接是一个向量,seq可以简接生成一个该向量对应的索引
> seq(y)
[1] 1 2 3 4 5 6


#rep
> rep(8,4)
[1] 8 8 8 8
> rep(c(1,2,3),4)
 [1] 1 2 3 1 2 3 1 2 3 1 2 3
> rep(c(1,2,3),each=4)
 [1] 1 1 1 1 2 2 2 2 3 3 3 3
each参数,控制每个元素的次数,如果没有,则按照整体处理







二、向量化编程

> u <- c(5,2,8)
> v <- c(1,3,9)
> u>v
[1]  TRUE FALSE FALSE
一般内置的函数都是逐个元素处理
在R中自定义函数也是默认输入参数是向量类型

> f <- function(x,c){return ((x+c)^2)}
> f(1:3,1:3)
[1]  4 16 36
可以看到x,c果然是北大当作向量处理了
如果想把输入限制为标量,需要加一些判断语句
> f <- function(x,c){
if(length(x)!=1) stop("vector c not allowed")
return ((x+c)^2)
}

三、NA与NULL

NA是存在的,但是不知道数值,所以是元素,而NULL不是元素
>n <- NULL
>length(n)
0
>m <- NA
>1
内置函数必须有na.rm = T才能参与运算,否则结果为NA
NULL一般用于循环中创建向量,减少内存的使用,因为做到了”用则开发空间“

四、向量的筛选

1.简单的布尔向量索引筛选
> y
[1]  1 10 20  5 45 23
> y[y>10]
[1] 20 45 23
2.subset()函数筛选,这个函数的好处是自动过滤NA值
> x
[1]  1  3  5 NA
> subset(x,x>3)
[1] 5
3.which()函数,which函数返会的是布尔索引
> which(y>10)
[1] 3 5 6
> y[which(y>10)]
[1] 20 45 23

五、ifelse()函数,这个函数对应与普通的版本,普通的if-else结果只能应对判断语句是标量的情况下

> x <- c(5,2,9,12)
> if(x>6)
+ {
+ x <- 2*x
+ }
Warning message:
In if (x > 6) { :
  the condition has length > 1 and only the first element will be used
判断语句x>6实际上有多个元素,会报错

改用ifelse语句
> ifelse(x>6,2*x,3*x)
[1] 15  6 18 24

六、向量元素的名称以及降级

向量元素是可以有名称,这样就可以通过元素对应的名称访问
> x
[1]  5  2  9 12
> names(x) <- c("a","b","c","d")
> x
 a  b  c  d 
 5  2  9 12 

由于向量要求每个元素同类型,当遇到不同类型的时候,会自动进行类型转换,转化为当前最低级别的,如果有character类型在,则一律转换为character
类型的
> c(5,2,"ddas")
[1] "5"    "2"    "ddas"  #全转换为character类型的
> c(1,2,3,c(1,2,3))#不同于python,这种语句并不是嵌套语句,在R中一般向量类型不存在嵌套语句,不同于python,但R中list是存在嵌套的结构的
并且由于list存在嵌套结构,单个[],和[[]]访问得到的结果是不一样的
[1] 1 2 3 1 2 3

矩阵和数组:(主要是矩阵,数组大同小异)

一、创建矩阵及其op

> m <- matrix(c(1,2,3,4),nrow = 2,ncol = 2)#指定一个也行,另一个默认自动计算,byrow=T or F
> m
     [,1] [,2]
[1,]    1    3
[2,]    2    4

Operation:
矩阵运算:%*%
> m <- matrix(c(1,2,3,4),nrow = 2,ncol = 2)
> m
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> n <- matrix(c(1,2,3,4),nrow = 2,ncol = 2,byrow = T)
> n
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> m * n
     [,1] [,2]
[1,]    1    6
[2,]    6   16

矩阵索引,在python中,用:表示对应维度所有的元素,在R中,如果取某一维度所有的元素,则该维度不需要填:
x[,c(1,2],表示所有行,1,2列
> n[,2]
[1] 2 4
可以对取出的值进行赋值,会修改原矩阵
矩阵元素筛选同向量,不在叙述

apply()函数的运用
apply函数可以对矩阵的某一行或某一列进行映射,apply函数家族还有很多,具体的可以用到的时候再查

删除矩阵的行或列
矩阵的维度是确定的,所有没有确定的函数可以进行这样的操作,但是可以对原矩阵赋值,达到修改矩阵shape的效果,

rbind,cbind可以分别按行结合,按列结合形成新的矩阵

矩阵本质就是一个向量,只是多了2个属性,行和列,所有可以对矩阵应用一系列的向量的函数,如length

(提示:输入函数名,可以看到对应函数体)

colnames()和rownames()可以分别对矩阵的列和行定义名字

有的时候对矩阵取子集,会引起意外的降维,导致类型转换
所以在用索引的时候,可以加一个drop=F选项,x[2,,drop = F]

高维数组

相当于把多个矩阵,或者比矩阵更高维的数据类型合并在一起,如下,f1,f2是2个矩阵,合并在一起,但是为什么不直接合并2个矩阵呢,c(f1,f2),这样得到的结果只是一个向量,前面已经说过,向量是没有内嵌套结构的,所以合并后产生的还是向量。

定义方式:array(data=c(f1,f2),dim=c(3,2,2))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值