R语言入门

最近在复习python的科学计算,突然心血来潮,想看看R的数据处理和python的区别在哪,所以就有了这篇文章。

R语言简介

四十多年前, R 语言的始祖诞生了 , John Chambers 在贝尔实验室中开发出S语言 ,用于快速地进行数据探索, 统计分析和可视化 。十几年后 , 新西兰奥克兰大学的 Robert Gentleman 和 Ross Ihaka 在 S 语言的基础上发明了 R 语言 。

R 语言流淌着统计学的血液 , 它内置了海量的统计函数 ,使用者可以利用其对数据进行快速交互分析 。 同时作为一门图灵完备的解释性语言 , R 的使用者比 SAS , SPSS 等统计软件的使用者拥有了更大程度的自由。

进入 21 世纪后 ,由于个人计算机的普及和统计学科的发展 , R 社群得以进一步发展 , 一些富有想象力的优秀工具涌现出来 。 如果把 R 语言比作一辆车的话 , Rstudio 的出现使得我们有了信息更加丰富的仪表盘 , dplyr , data.table 等等数据处理的包加强了引擎 , ggplot , shiny 等等可视化的工具使得车的外型更好看。

与大多用于工程实践的编程语言相比 , R 语言更像是一个灵巧的研究工具 ,在处理大量数据 , 性能方面比较薄弱。但是与其他工具交互就能漂亮地解决问题 , 例如与 Spark 配合 (sparkR) 解决数据量较大的情况 , 与 C++(Rcpp) 配合可以解决性能不足的问题。

早在五十多年前 , John Tukey 就在论文 "The Future of Data Analysis"[1] 中发表了这样的看法:统计学不应该只是关于统计推断的数学理论,而应该和现实世界联系起来,成为一种“科学”。为了实现这样的目标,需要有收集和整理数据、分析和解释数据的技术,并且把实践当成检验理论的标准。

R语言及其生态作为连接现实世界中的数据和数学模型的桥梁,正在社群的努力下一步一步地把这些想法具体化。

让我们进入 R 语言的世界!

R语言的安装

ubuntu下安装

1、直接到官网上下载安装包(tar.gz),然后依次安装即可。 2、在网速可以的情况下,利用在apt-get安装是一种更为方便的方式:

sudo apt-get update
sudo apt-get install r-base
sudo apt-get install r-base-dev

MAC下安装

mac安装更简单 下载R安装包,完成后点安装。

R语言基本数据结构

下面用 R 的解释器来熟悉一下 R 语言的基本数据结构。

首先让我们先进入 R 环境下 我是在mac操作环境下的,ubuntu的是一样的。

 youdi@liangchangyoudeMacBook-Pro  ~  R

R version 3.4.1 (2017-06-30) -- "Single Candle"
Copyright (C) 2017 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)

R是自由软件,不带任何担保。
在某些条件下你可以将其自由散布。
用'license()'或'licence()'来看散布的详细条件。

R是个合作计划,有许多人为之做出了贡献.
用'contributors()'来看合作者的详细情况
用'citation()'会告诉你如何在出版物中正确地引用R或R程序包。

用'demo()'来看一些示范程序,用'help()'来阅读在线帮助文件,或
用'help.start()'通过HTML浏览器来看帮助文件。
用'q()'退出R.
>
>

向量

向量是 R 语言中最基本的数据类型,在 R 中没有单独的标量(例如 1 本质上是 c(1)) 。

赋值

R 中可以用 = 或者 <- 来进行赋值 , <-的快捷键是 alt + - 。

> a <- c(4,5,6)
> a
[1] 4 5 6
筛选

我们可以用下标来筛选,例如

> a[1:2]
[1] 4 5
> a[3]
[1] 6

注意 R 语言的下标是从 1 开始的。

当然我们也可以用逻辑进行筛选,例如

> a[a>4]
[1] 5 6
> a[a>5]
[1] 6

为了了解这个式子的原理,我们先看看 a>4 是什么

> a>4
[1] FALSE  TRUE  TRUE

我们可以看到这是一个布尔值构成的向量,我们在用这个布尔值 做下标时只会选出答案为 TRUE 的值。 另外,负数下标表示不选这个这些下标,例如:

> a[-1]
[1] 5 6
> a[-2]
[1] 4 6
> a[-3]
[1] 4 5
> a[-4]
[1] 4 5 6
合并向量

c() 可以合并向量,例如

> c(a[1] , 3 , a[2:3] , 1)
[1] 4 3 5 6 1
循环补齐

向量有个比较有趣的性质,当两个向量进行操作时,如果长度不等, 长度比较短的一个会复制自己直到自己和长的一样长。

> b
[1] 1 2 3 4 5 6 7 8
> a
[1] 4 5 6
> a + b
[1]  5  7  9  8 10 12 11 13
Warning message:
In a + b : 长的对象长度不是短的对象长度的整倍数
> b <- c(1,2,3,4,5,6,7,8,9)
> a + b
[1]  5  7  9  8 10 12 11 13 15
> length(b)
[1] 9
> which.max(b)
[1] 9
> which.min(b)
[1] 1

不懂就使用help()查看命令手册

矩阵

矩阵,从本质上来说就是多维的向量,我们来看一看

我们如何新建一个矩阵。

> a <- matrix(c(1,2,3,4,5,6,7,8,9), nrow=3)
> a
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

matrix有很多参数

help(matrix)

Usage:

     matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
            dimnames = NULL)

     as.matrix(x, ...)
     ## S3 method for class 'data.frame'
     as.matrix(x, rownames.force = NA, ...)

     is.matrix(x)
筛选矩阵

与向量相似,我们可以用下标来筛选矩阵,

例如:

> a[1, 2:3]
[1] 4 7

可以看到结果退化成了一个向量

线性代数

当我们对两个矩阵相乘,我们得到的结果是

对应元素两两相乘的结果,例如

> a
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> a * a
     [,1] [,2] [,3]
[1,]    1   16   49
[2,]    4   25   64
[3,]    9   36   81

而这不是我们想要的矩阵乘法,在 R 中我们在乘法旁边加两个

百分号来做矩阵乘法:

> a%*%a
     [,1] [,2] [,3]
[1,]   30   66  102
[2,]   36   81  126
[3,]   42   96  150

此外,我们可以用 t() 来求矩阵的转置 , 用 solve() 来求矩阵的逆。

数据框

数据框类似矩阵,与矩阵不同的是,数据框可以有不同的数据类型。

一般做数据分析,我们把一个类似 excel 的表格读入 R ,默认的格式

就是数据框 , 可见数据框是一个非常重要的数据结构。

一般来说我们需要分析的数据,每一行代表一个样本,每一列代表一个

变量。

下面我们用 R 内置的数据集 iris 来看一看数据框的使用。

> data("iris")
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> tail(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica
> tail(iris, 20)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
131          7.4         2.8          6.1         1.9 virginica
132          7.9         3.8          6.4         2.0 virginica
133          6.4         2.8          5.6         2.2 virginica
134          6.3         2.8          5.1         1.5 virginica
135          6.1         2.6          5.6         1.4 virginica
136          7.7         3.0          6.1         2.3 virginica
137          6.3         3.4          5.6         2.4 virginica
138          6.4         3.1          5.5         1.8 virginica
139          6.0         3.0          4.8         1.8 virginica
140          6.9         3.1          5.4         2.1 virginica
141          6.7         3.1          5.6         2.4 virginica
142          6.9         3.1          5.1         2.3 virginica
143          5.8         2.7          5.1         1.9 virginica
144          6.8         3.2          5.9         2.3 virginica
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica

我们用 data 函数调入了 iris 这个数据集 , 然后用 head 函数来看一看这个数据

的前几行 , tail 函数来看一看这个数据

的后几行 可以看到有 sepal 的长度,宽度,petal 的长度和宽度,还有一个变量

Species 来描述样本的类别。

我们可以用 summary 函数来对数据集做大致的了解:

> sum
sum                 summary.Date        summary.POSIXlt     summary.connection  summary.default     summary.glm         summary.manova      summary.proc_time   summary.srcref      summary.table
summary             summary.POSIXct     summary.aov         summary.data.frame  summary.factor      summary.lm          summary.matrix      summary.srcfile     summary.stepfun     summaryRprof
> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300
 Median :5.800   Median :3.000   Median :4.350   Median :1.300
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500
       Species
 setosa    :50
 versicolor:50
 virginica :50

可以直观地看到每个变量的信息,对于几个数值变量,我们可以看到最小值,中位数等等统计信息。而对于 Species 这个分类变量,我们看到的是计数信息。

筛选数据框与矩阵相似,都可以通过数字下标来获取子集,不同地是因为数据框有不同的列名,我们也可以通过列名来获取某一特定列,例如

> iris$Species
  [1] setosa     setosa     setosa     setosa     setosa     setosa
  [7] setosa     setosa     setosa     setosa     setosa     setosa
 [13] setosa     setosa     setosa     setosa     setosa     setosa
 [19] setosa     setosa     setosa     setosa     setosa     setosa
 [25] setosa     setosa     setosa     setosa     setosa     setosa
 [31] setosa     setosa     setosa     setosa     setosa     setosa
 [37] setosa     setosa     setosa     setosa     setosa     setosa
 [43] setosa     setosa     setosa     setosa     setosa     setosa
 [49] setosa     setosa     versicolor versicolor versicolor versicolor
 [55] versicolor versicolor versicolor versicolor versicolor versicolor
 [61] versicolor versicolor versicolor versicolor versicolor versicolor
 [67] versicolor versicolor versicolor versicolor versicolor versicolor
 [73] versicolor versicolor versicolor versicolor versicolor versicolor
 [79] versicolor versicolor versicolor versicolor versicolor versicolor
 [85] versicolor versicolor versicolor versicolor versicolor versicolor
 [91] versicolor versicolor versicolor versicolor versicolor versicolor
 [97] versicolor versicolor versicolor versicolor virginica  virginica
[103] virginica  virginica  virginica  virginica  virginica  virginica
[109] virginica  virginica  virginica  virginica  virginica  virginica
[115] virginica  virginica  virginica  virginica  virginica  virginica
[121] virginica  virginica  virginica  virginica  virginica  virginica
[127] virginica  virginica  virginica  virginica  virginica  virginica
[133] virginica  virginica  virginica  virginica  virginica  virginica
[139] virginica  virginica  virginica  virginica  virginica  virginica
[145] virginica  virginica  virginica  virginica  virginica  virginica
Levels: setosa versicolor virginica

我们可以用 names() 函数来获取数据框的列名:

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

并可以通过为其赋值改变列的名字。

列表

列表是一种递归式的向量,我们可以用列表来存储不同类型的数据,比如

> l <- list(name="youdi" , height=176 , weight = 67, man =  TRUE)
> l
$name
[1] "youdi"

$height
[1] 176

$weight
[1] 67

$man
[1] TRUE

列表有多种索引方式,可以用如下方式获取。

> l$name
[1] "youdi"
> l$height
[1] 176
> l$man
[1] TRUE
> l[1]
$name
[1] "youdi"

> l[[2]]
[1] 176
> l[['man']]
[1] TRUE

上面的内容涵盖了 R 语言最基本的数据结构.

R 语言学习优秀资源

网络资源

DataCamp : 一个提供云端R语言解释器的网站 ,提供了多门与数据科学有关的课程,可以借助此网站快速上手。

统计之都 : 国内质量最高的统计网站,有一些关于统计和R语言的优秀博客以及与R有关的会议通知。

肖凯博客(需翻墙): 很有质感的博客,有大量 R 语言应用的案例。

数据科学相关书籍

R for data science : 由 Hadley Wickham 合作编写的 2017 年出版的书籍 ,主要介绍的 tidyverse 生态 , tidyverse 中包括了 dplyr(用于数据处理) , ggplot(用于画图)等包,大幅增强了 R 语言的表现力 , 有免费的在线版本。

R 语言实战 : 一本从统计角度介绍 R 语言的书籍 ,较为简单 , 适合快速翻阅。

An Introduction to Statistical Learning : 斯坦福统计系几位教授出版的统计学习书籍,对统计学习进行了清晰细致的讲解 , 书有开源版本 ,并且在Stanford Lagunita上有配套课程

Machine Learning For Hackers : 使用机器学习解决问题的一本书 , 有很多有趣的案例 。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

有没有一段代码,让你觉得人类的智慧也可以璀璨无比?

Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推...

873
来自专栏数据派THU

教你用Python进行自然语言处理(附代码)

3608
来自专栏ACM算法日常

5行位运算,map靠边站——位操作进阶

Given an array of integers, every element appears three times except for one. F...

1131
来自专栏Crossin的编程教室

【Python 第53课】 数学运算

今天从打飞机游戏里中断一下,说些python的基础。 在用计算机编程解决问题的过程中,数学运算是很常用的。python自带了一些基本的数学运算方法,这节课给大家...

3434
来自专栏hadoop学习笔记

Hanlp自然语言处理工具的使用演练

Hanlp是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。Hanlp具备功能完善、性能高效、架构清洗、语料时新、可自定义的特点;提供...

1942
来自专栏余林丰

初学数据挖掘——相似性度量(二)

  上一篇中介绍了四个算法,并用四个算法分别计算了两个人的相似度。这篇就来讲讲相似性算法在实际当中怎么用。第一:将指定的人与其他人作相似性比较,并从高到低进行排...

2316
来自专栏Java面试通关手册

六道面试中常见的智力题 来看看你会做几道?

下面的题目来自滴滴出行2017秋招题。这些题目是我自己觉得比较难或者比较容易出错的题目。

2104
来自专栏C语言及其他语言

[每日一题]矩阵转置(1242)

题目描述 输入N*N的矩阵,输出它的转置矩阵。 输入 第一行为整数N。 接着是一个N*N的矩阵。 输出 转置矩阵 样例输入 2 1 2 1 2 样例输出 1 ...

3439
来自专栏算法channel

AI 路上,第一步这么走下去...

算法是描述解决一个问题的步骤,外界给它所指定的数据,然后经过一系列步骤输出一个结果。为了更快更轻量级地解决问题,我们会选择高效精简的结构去实现,这种结构称为数据...

1246
来自专栏机器之心

机器学习时代的哈希算法,将如何更高效地索引数据

2275

扫码关注云+社区

领取腾讯云代金券