美文网首页R语言数据-R语言-图表-决策-Linux-PythonCook R
小洁详解《R数据科学》--第十五章 向量(上)

小洁详解《R数据科学》--第十五章 向量(上)

作者: 小洁忘了怎么分身 | 来源:发表于2018-11-07 22:57 被阅读4次

1.准备工作

library(tidyverse)
#> ── Attaching packages ────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
#> ✔ ggplot2 3.0.0     ✔ purrr   0.2.5
#> ✔ tibble  1.4.2     ✔ dplyr   0.7.6
#> ✔ tidyr   0.8.1     ✔ stringr 1.3.1
#> ✔ readr   1.1.1     ✔ forcats 0.3.0
#> ── Conflicts ───────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag()    masks stats::lag()
#需要用到其中的purrr

2.向量的分类

一直以为向量就是c(),现在发现类型很多哇。

(1)NULL

首先不认识的是NULL,长度为零。也就是啥都没有的空向量。与NA不同,NA还是有长度的!

length(NA)
#> [1] 1
length(NULL)
#> [1] 0

如果正常所熟知的向量是种在坑里的萝卜。那么NA就只是没萝卜,而NULL则是没坑的!

(2)原子向量,就是平常所熟知的c()

  • 逻辑型
  • 数值型
  • 整型
  • 双精度型
  • 字符型
  • 负数型和原始型暂不学习。

(3)列表

对list早有耳闻,今天才知道它就是“递归向量”,可以嵌套的。

了解向量类型和长度,方法:

class(letters)
#> [1] "character"
typeof(letters)
#> [1] "character"
#对列表做一个尝试,同样的几个元素用c和list分别组合,他们的长度是不同滴!
x <- c("a", "b", 1:10)
length(x)
#> [1] 12
x2 <- list("a", "b", 1:10)
length(x2)
#> [1] 3

3.重要的原子向量

(1)最简单-逻辑型

只有 3 个可能的取值: FALSE、 TRUE 和 NA。

(2)数值型

整型和双精度型的比较和区别

typeof(1)#默认是双精度型
#> [1] "double"
typeof(1L)#指定为整型
#> [1] "integer"

#双精度型是近似值
sqrt(2) ^ 2==2
#> [1] FALSE
dplyr::near(sqrt(2) ^ 2,2)
#> [1] TRUE

特殊值

双精度型数据有4个特殊值: NA、 NaN、 Inf 和 -Inf
翻译过来就是,空值,非数字,正无穷,负无穷

用is.finite()、 is.infinite() 和is.nan()鉴定类型。

我小学老师好像说过,0为分母就是无意义的数字。可是刚才试了下:

is.nan(3/0)
#> [1] FALSE
#居然false。那么他是啥?
3/0
#> [1] Inf
#好的,受教了,他是无限值。

(3)字符型

R对每个唯一的字符串只保存一次,节省内存。

#算法
x <- "This is a reasonably long string."
pryr::object_size(x)
#> 152 B
#1000倍应该是136kb
y1 <- rep(x, 500)
y2 <- rep(x, 1000)
pryr::object_size(y1)
#> 4.14 kB
pryr::object_size(y2)
#> 8.14 kB
#实际上小很多,y 中的每个元素都只是指向一个字符串的指针,大小8B
#所以算法是y1: 8 * :500 + 136=4136B=4.14kb
#y2:8 * 1000 + 136=8136B=8.14kb

(4)缺失值

NA居然还分类型。记下来:

NA
#> [1] NA
NA_integer_
#> [1] NA
NA_real_
#> [1] NA
NA_character_
#> [1] NA

4.使用原子向量

(1)强制转换

  • 显式转换
    as.logical()、 as.integer()、 as.double() 、 as.character()、
  • 隐式转换
    在数值环境中使用逻辑向量,TRUE 转换为 1, FALSE 转换为 0。
    所以sum成了计数,mean成了比例!

用c()将两种不同类型的元素放到一起,转换为最复杂的元素类型。

所以我回去看了一下刚才创建的x

x <- c("a", "b", 1:10)
typeof(x)
#> [1] "character"
#书上的另外几个例子
typeof(c(TRUE, 1L))
#> [1] "integer"
typeof(c(1L, 1.5))
#> [1] "double"
typeof(c(1.5, "a"))
#> [1] "character"

看过例子明白了“最复杂的”的意思,数字可以转换为字符,字符却不能转换为数字。同样,双精度也无法转换为整数,能转化的就是软柿子啦,敌不动我动。

(2)检验函数-is.*

·················图片·················

(3)标量与循环规则

向量循环--对向量长度进行强制转换。

  • R中的“标量”,是长度为1的向量。
  • 向量与标量的例子:
sample(10)+100
#>  [1] 104 106 103 105 107 109 108 101 102 110
runif(10) > 0.5
#>  [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#向量有多少个元素,就有多少个结果。
  • 两个长短不同的向量
#不用书上的例子了,换个简单的。
1:4+1:2
#> [1] 2 4 4 6
#长是短的倍数,就默默循环,四个数字是1+1,2+2,3+1,4+2的出来的。
1:3+1:2
#> Warning in 1:3 + 1:2: longer object length is not a multiple of shorter
#> object length
#> [1] 2 4 4
#产生警告信息,告诉你不成对。

在tibble中则会直接报错,需要手动rep。

rep有两个用法:times和each。默认是times。

tibble(x = 1:4, y = rep(1:2, times = 2))#times不写也一样的。
#> # A tibble: 4 x 2
#>       x     y
#>   <int> <int>
#> 1     1     1
#> 2     2     2
#> 3     3     1
#> 4     4     2
tibble(x = 1:4, y = rep(1:2, each = 2))
#> # A tibble: 4 x 2
#>       x     y
#>   <int> <int>
#> 1     1     1
#> 2     2     1
#> 3     3     2
#> 4     4     2

(4)向量命名

在14章看到一个函数说是判断向量有没有名字。。嗯。这里讲怎么命名啦。

c(x = 1, y = 2, z = 4)
#> x y z 
#> 1 2 4
set_names(1:3, c("a", "b", "c"))
#> a b c 
#> 1 2 3

(5)向量取子集

  • 按位置提取
x <- c("one", "two", "three", "four", "five")
x[c(3, 2, 5)]#按照位置提取
#> [1] "three" "two"   "five"
x[c(1, 1, 5, 5, 5, 2)]#竟然可以重复
#> [1] "one"  "one"  "five" "five" "five" "two"
x[c(-1, -3, -5)]#除了某几个
#> [1] "two"  "four"
#x[c(1, -1)] 不可以正负混合
  • 用逻辑向量取子集
x <- c(1:10,NA)
x[x>4]
#> [1]  5  6  7  8  9 10 NA
x[!is.na(x)]#非空值
#>  [1]  1  2  3  4  5  6  7  8  9 10
x[x %% 2 == 0]#偶数
#> [1]  2  4  6  8 10 NA

相关文章

网友评论

    本文标题:小洁详解《R数据科学》--第十五章 向量(上)

    本文链接:https://www.haomeiwen.com/subject/eznbxqtx.html