R语言-线性回归

分類 编程语言, R语言

R - 线性回归

R 语言实例 R 语言实例

在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。

简单对来说就是用来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。

回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

一元线性回归分析法的数学方程:

1
y = ax + b
  • y 是因变量的值。

  • x 是自变量的值。

  • ab 为一元线性回归方程的参数。

接下来我们可以创建一个人体身高与体重的预测模型:

  • 1、收集样本数据:身高与体重。
  • 2、使用 lm() 函数来创建一个关系模型。
  • 3、从创建的模型中找到系数,并创建数学方程式。
  • 4、获取关系模型的概要,了解平均误差即残差(估计值与真实值之差)。
  • 5、使用 predict() 函数来预测人的体重。

准备数据

以下是人的身高与体重数据:

1
2
3
4
5
# 身高,单位 cm
151, 174, 138, 186, 128, 136, 179, 163, 152, 131

# 体重,单位 kg
63, 81, 56, 91, 47, 57, 76, 72, 62, 48

lm() 函数

在 R 中,你可以通过函数 lm() 进行线性回归。

lm() 函数用于创建自变量与因变量之间的关系模型。

lm() 函数语法格式如下:

1
lm(formula,data)

参数说明:

  • formula - 一个符号公式,表示 x 和 y 之间的关系。
  • data - 应用数据。

创建关系模型,并获取系数:

实例

1
2
3
4
5
6
7
8
\# 样本数据  
x <- c(151, 174, 138, 186, 128, 136, 179, 163, 152, 131)
y <- c(63, 81, 56, 91, 47, 57, 76, 72, 62, 48)

\# 提交给 lm() 函数
relation <- lm(y~x)

print(relation)

执行以上代码输出结果为:

1
2
3
4
5
6
Call:
lm(formula = y ~ x)

Coefficients:
(Intercept) x
-38.4551 0.6746

使用 summary() 函数获取关系模型的概要:

实例

1
2
3
4
5
6
7
x <- c(151, 174, 138, 186, 128, 136, 179, 163, 152, 131)  
y <- c(63, 81, 56, 91, 47, 57, 76, 72, 62, 48)

\# 提交给 lm() 函数
relation <- lm(y~x)

print(summary(relation))

执行以上代码输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Call:
lm(formula = y ~ x)

Residuals:
Min 1Q Median 3Q Max
-6.3002 -1.6629 0.0412 1.8944 3.9775

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -38.45509 8.04901 -4.778 0.00139 **
x 0.67461 0.05191 12.997 1.16e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.253 on 8 degrees of freedom
Multiple R-squared: 0.9548, Adjusted R-squared: 0.9491
F-statistic: 168.9 on 1 and 8 DF, p-value: 1.164e-06

predict() 函数

predict() 函数用于根据我们建立的模型来预测数值。

predict() 函数语法格式如下:

1
predict(object, newdata)

参数说明:

  • object - lm() 函数创建的公式。
  • newdata - 要预测的值。

以下实例我们预测一个新的体重值:

实例

1
2
3
4
5
6
7
8
9
10
11
\# 样本数据  
x <- c(151, 174, 138, 186, 128, 136, 179, 163, 152, 131)
y <- c(63, 81, 56, 91, 47, 57, 76, 72, 62, 48)

\# 提交给 lm() 函数
relation <- lm(y~x)

\# 判断身高为 170cm 的体重
a <- data.frame(x \= 170)
result <-  predict(relation,a)
print(result)

执行以上代码输出结果为:

1
2
1 
76.22869

我们也可以生成一个图表:

实例

1
2
3
4
5
6
7
8
9
10
11
\# 样本数据  
x <- c(151, 174, 138, 186, 128, 136, 179, 163, 152, 131)
y <- c(63, 81, 56, 91, 47, 57, 76, 72, 62, 48)
relation <- lm(y~x)

\# 生成 png 图片
png(file \= "linearregression.png")

\# 生成图表
plot(y,x,col \= "blue",main \= "Height & Weight Regression",
abline(lm(x~y)),cex \= 1.3,pch \= 16,xlab \= "Weight in Kg",ylab \= "Height in cm")

图表如下:

R 语言实例 R 语言实例

留言與分享

R语言-绘图

分類 编程语言, R语言

R 绘图 - 饼图

R 语言提供来大量的库来实现绘图功能。

饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。

R 语言使用 pie() 函数来实现饼图,语法格式如下:

1
2
3
4
pie(x, labels = names(x), edges = 200, radius = 0.8,
clockwise = FALSE, init.angle = if(clockwise) 90 else 0,
density = NULL, angle = 45, col = NULL, border = NULL,
lty = NULL, main = NULL, …)
  • x: 数值向量,表示每个扇形的面积。
  • labels: 字符型向量,表示各扇形面积标签。
  • edges: 这个参数用处不大,指的是多边形的边数(圆的轮廓类似很多边的多边形)。
  • radius: 饼图的半径。
  • main: 饼图的标题。
  • clockwise: 是一个逻辑值,用来指示饼图各个切片是否按顺时针做出分割。
  • angle: 设置底纹的斜率。
  • density: 底纹的密度。默认值为 NULL。
  • col: 是表示每个扇形的颜色,相当于调色板。

绘制饼状图要做这些准备:反映数量的向量、各部分的标签、各部分的颜色(可选)。

接下来我们绘制一个简单的饼图:

实例

1
2
3
4
5
6
7
8
9
10
11
\# 数据准备  
info = c(1, 2, 4, 8)

\# 命名
names = c("Google", "Runoob", "Taobao", "Weibo")

\# 涂色(可选)
cols = c("#ED1C24","#22B14C","#FFC90E","#3f48CC")

\# 绘图
pie(info, labels\=names, col\=cols)

执行绘图程序,会在当前目录下生存一个 PDF 文件(Rplots.pdf),打开文件可以看到图形效果如下:

我们也可以使用 png()、jpeg()、bmp() 函数设置输出的文件格式为图片:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
\# 数据准备  
info \= c(1, 2, 4, 8)

\# 命名
names \= c("Google", "Runoob", "Taobao", "Weibo")

\# 涂色(可选)
cols \= c("#ED1C24","#22B14C","#FFC90E","#3f48CC")

\# 设置输出图片
png(file\='runoob-pie.png', height\=300, width\=300)
\# 绘图
pie(info, labels\=names, col\=cols)

接下来我们给饼图设置标题,中文字体需要设置字体参数 family=‘GB1’,也可以自己设置字体库,详细参考:R 绘图 - 中文支持

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\# 数据准备  
info = c(1, 2, 4, 8)

\# 命名
names = c("Google", "Runoob", "Taobao", "Weibo")

\# 涂色(可选)
cols = c("#ED1C24","#22B14C","#FFC90E","#3f48CC")
\# 计算百分比
piepercent = paste(round(100\*info/sum(info)), "%")
\# 绘图
pie(info, labels\=piepercent, main = "网站分析", col\=cols, family\='GB1')
\# 添加颜色样本标注
legend("topright", names, cex\=0.8, fill\=cols)

如果要绘制 3D 的饼图,可以使用 plotrix 库的 pie3D() 函数,使用前我们需要先安装:

1
install.packages("plotrix", repos = "https://mirrors.ustc.edu.cn/CRAN/")

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
\# 载入 plotrix  
library(plotrix)
\# 数据准备
info \= c(1, 2, 4, 8)

\# 命名
names \= c("Google", "Runoob", "Taobao", "Weibo")

\# 涂色(可选)
cols \= c("#ED1C24","#22B14C","#FFC90E","#3f48CC")

\# 设置文件名,输出为 png
png(file \= "3d\_pie\_chart.png")

\# 绘制 3D 图,family 要设置你系统支持的中文字体库
pie3D(info,labels \= names,explode \= 0.1, main \= "3D 图",family \= "STHeitiTC-Light")

生成图片如下所示:

R 绘图 - 条形图

条形图,也称为柱状图条形图,是一种以长方形的长度为变量的统计图表。

条形图可以是水平或垂直的,每个长方形可以有不同的颜色。

R 语言使用 barplot() 函数来创建条形图,格式如下:

1
barplot(H,xlab,ylab,main, names.arg,col,beside)

参数说明:

  • H 向量或矩阵,包含图表用的数字值,每个数值表示矩形条的高度。
  • xlab x 轴标签。
  • ylab y 轴标签。
  • main 图表标题。
  • names.arg 每个矩形条的名称。
  • col 每个矩形条的颜色。

接下来我们创建一个简单的条形图:

实例

1
2
3
4
5
\# 准备一个向量  
cvd19 \= c(83534,2640626,585493)

\# 显示条形图
barplot(cvd19)

执行绘图程序,会在当前目录下生存一个 PDF 文件(Rplots.pdf),打开文件可以看到图形效果如下:

为了更好地表达信息,我们可以在图表上添加标题、颜色及每个矩形条的名称。

以下我们创建 2020 年 7 月 1 日中国、美国和印度的新冠疫情确诊人数统计图。

中文字体需要设置字体参数 family=‘GB1’:

实例

1
2
3
4
5
6
7
8
cvd19 \= c(83534,2640626,585493)

barplot(cvd19,
    main\="新冠疫情条形图",
    col\=c("#ED1C24","#22B14C","#FFC90E"),
    names.arg\=c("中国","美国","印度"),
    family\='GB1'
)

barplot 中的数据既可以是向量,也可以是矩阵,现在我们生成一张新冠疫情 6 月和 7 月对比图。

首先准备数据:

中国 美国 印度
6 月 83017 1794546 190535
7 月 83534 2640626 585493

转换成矩阵,生成条形图,按并排格式显示,而且要显示颜色样本。

这里我们设置了自己的字体库,详细内容可以参考 R 绘图 - 中文支持

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library(showtext);  
font\_add("SyHei", "SourceHanSansSC-Bold.otf");
cvd19 \= matrix(
  c(83017, 83534, 1794546, 2640626, 190535, 585493),
  2, 3
)

\# 设置文件名,输出为 png
png(file \= "runoob-bar-1.png")

#加载字体
showtext\_begin();

colnames(cvd19) \= c("中国", "美国", "印度")
rownames(cvd19) \= c("6月", "7月")
barplot(cvd19, main \= "新冠疫情条形图", beside\=TRUE, legend\=TRUE,  family\='SyHei')

\# 去掉字体
showtext\_end();

以下代码会在当前程序目录下生存一个 runoob-bar-1.png 文件,如下所示:

我们设置的颜色样本将是每各组的颜色样本:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
library(plotrix)  
library(showtext);
font\_add("SyHei", "SourceHanSansSC-Bold.otf");
cvd19 \= matrix(
  c(83017, 83534, 1794546, 2640626, 190535, 585493),
  2, 3
)

\# 设置文件名,输出为 png
png(file \= "runoob-bar-2.png")
#加载字体
showtext\_begin();
colnames(cvd19) \= c("中国", "美国", "印度")
rownames(cvd19) \= c("6月", "7月")

barplot(cvd19, main \= "新冠疫情条形图", beside\=TRUE, legend\=TRUE,col\=c("blue","green"),  family\='SyHei')
\# 去掉字体
showtext\_end();

以下代码会在当前程序目录下生存一个 runoob-bar-2.png 文件,如下所示:

beside 参数

beside 设置矩形条堆叠的方式,默认为 FALSE:

  • beside=FALSE 时,条形图的高度是矩阵的数值,矩形条是水平堆叠的。

  • beside=TRUE 时,条形图的高度是矩阵的数值,矩形条是并列的。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
library(showtext);  
font\_add("SyHei", "SourceHanSansSC-Bold.otf");
cvd19 \= matrix(
  c(83017, 83534, 1794546, 2640626, 190535, 585493),
  2, 3
)

\# 设置文件名,输出为 png
png(file \= "runoob-bar-3.png")
#加载字体
showtext\_begin();
colnames(cvd19) \= c("中国", "美国", "印度")
rownames(cvd19) \= c("6月", "7月")

barplot(cvd19, main \= "新冠疫情条形图", beside\=FALSE, legend\=TRUE,col\=c("blue","green"),  family\='SyHei')
\# 去掉字体
showtext\_end();

以下代码会在当前程序目录下生存一个 runoob-bar-3.png 文件,如下所示:

R 绘图 - 函数曲线图

函数曲线图是研究函数的重要工具。

R 中 curve() 函数可以绘制函数的图像,代码格式如下:

1
2
3
4
5
6
curve(expr, from = NULL, to = NULL, n = 101, add = FALSE,
type = "l", xname = "x", xlab = xname, ylab = NULL,
log = NULL, xlim = NULL, …)

# S3 函数的方法
plot(x, y = 0, to = 1, from = y, xlim = NULL, ylab = NULL, …)

**注:**R 语言的类有 S3 类和 S4 类,S3 类用的比较广,创建简单粗糙但是灵活,而 S4 类比较精细。

参数:

  • expr:函数表达式
  • from 和 to:绘图的起止范围
  • n:一个整数值,表示 x 取值的数量
  • add:是一个逻辑值,当为 TRUE 时,表示将绘图添加到已存在的绘图中。
  • type:绘图的类型,p 为点、l 为直线, o 同时绘制点和线,且线穿过点。
  • xname:用于 x 轴变量的名称。
  • xlim 和 ylim 表示x轴和y轴的范围。
  • xlab,ylab:x 轴和 y 轴的标签名称。

plot 函数中,x 和 y 分别表示所绘图形的横坐标和纵坐标。

以下我们绘制一个 sin(x) 函数的图表:

1
curve(sin(x), -2 * pi, 2 * pi)

注意:任何计算机绘图工具绘制的都是模式图,它并不能保证与真的函数图像一模一样,它只是每隔一段距离取一个点,然后计算这个点的"高度"并绘制出来,为了保证曲线连续性,相邻两个点之间会有直线连接,所以在某些情况下例如 tan(x) 可能会出现错误:

在每一个 (2n+1)Pi / 2 的位置都会出现断点,但是 R 的图像将它们连接了,希望大家理解这一点。

当然,不是所有的函数都像 sin 一样支持向量处理,我们也可以手动生成一个数字序列然后用 plot 函数生成函数图像。假设函数 f 仅支持单个数值作为参数:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\# 定义函数 f  
f \= function (x) {
    if (x \>= 0) {
        x
    } else {
        x ^ 2
    }
}

\# 生成自变量序列
x \= seq(\-2, 2, length\=100)

\# 生成因变量序列
y \= rep(0, length(x))
j \= 1
for (i in x) {
    y\[j\] \= f(i)
    j \= j + 1
}

\# 绘制图像
plot(x, y, type\='l')

接下来我们使用 plot() 函数对向量数据进行绘图:

实例

1
2
3
4
5
6
7
8
9
\# 向量数据  
v <- c(7,12,28,3,41)

\# 生成图片
png(file \= "line\_chart\_label\_colored.jpg")

\# 绘图、线图颜色为红色,main 参数用于设置标题
plot(v,type \= "o", col \= "red", xlab \= "Month", ylab \= "Rain fall",
   main \= "Rain fall chart")

R 绘图 - 散点图

散点图是将所有的数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置由变量的数值决定,每个点对应一个 X 和 Y 轴点坐标。

散点图可以使用 plot() 函数来绘制,语法格式如下:

1
plot(x, y, type="p", main, xlab, ylab, xlim, ylim, axes)
  • x 横坐标 x 轴的数据集合

  • y 纵坐标 y 轴的数据集合

  • type:绘图的类型,p 为点、l 为直线, o 同时绘制点和线,且线穿过点。

  • main 图表标题。

  • xlab、ylab x 轴和 y 轴的标签名称。

  • xlim、ylim x 轴和 y 轴的范围。

  • axes 布尔值,是否绘制两个 x 轴。

type 参数可选择值:

  • p:点图
  • l:线图
  • b:同时绘制点和线
  • c:仅绘制参数 b 所示的线
  • o:同时绘制点和线,且线穿过点
  • h:绘制出点到横坐标轴的垂直线
  • s:阶梯图,先横后纵
  • S:阶梯图,先纵后竖
  • n: 空图

创建一个简单的线图:

实例

1
2
3
4
5
6
x<-c(10,40)  
y<-c(20,60)
\# 生成 png 图片
png(file \= "runnob-test-plot2.png")

plot(x, y, "l")

创建一个简单的线图,type 使用 o 参数,同时绘制点和线,且线穿过点:

实例

1
2
3
4
5
6
x<-c(10,40)  
y<-c(20,60)
\# 生成 png 图片
png(file \= "runnob-test-plot.png")

plot(x, y, "o")

接下来我们使用 R 语言的内置数据集 mtcars 来进行测试。

我们使用 mtcars 数据集的 wt 和 mpg 列:

实例

1
2
input <- mtcars\[,c('wt','mpg')\]  
print(head(input))

输出结果为:

1
2
3
4
5
6
7
wt  mpg
Mazda RX4 2.620 21.0
Mazda RX4 Wag 2.875 21.0
Datsun 710 2.320 22.8
Hornet 4 Drive 3.215 21.4
Hornet Sportabout 3.440 18.7
Valiant 3.460 18.1

接着我们使用以上数据生存一个散点图

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\# 数据  
input <- mtcars\[,c('wt','mpg')\]

\# 生成 png 图片
png(file \= "scatterplot.png")

\# 设置坐标 x 轴范围 2.5 到 5, y 轴范围 15 到 30.
plot(x \= input$wt,y \= input$mpg,
   xlab \= "Weight",
   ylab \= "Milage",
   xlim \= c(2.5,5),
   ylim \= c(15,30),              
   main \= "Weight vs Milage"
)

散点图矩阵

散点图矩阵是借助两变量散点图的作图方法,它可以看作是一个大的图形方阵,其每一个非主对角元素的位置上是对应行的变量与对应列的变量的散点图。而主对角元素位置上是各变量名,这样,借助散点图矩阵可以清晰地看到所研究多个变量两两之间的相关关系。

散点图矩阵就是把数据集中的每个数值变量两两绘制散点图。

R 语言使用以下函数创建散点图矩阵:

1
pairs(formula, data)

参数:

  • formula 变量系列

  • data 变量的数据集

实例

1
2
3
4
5
6
\# 输出图片  
png(file \= "scatterplot\_matrices.png")

\# 4 个变量绘制矩阵,12 个图

pairs(~wt+mpg+disp+cyl,data \= mtcars, main \= "Scatterplot Matrix")

留言與分享

R语言-读取数据

分類 编程语言, R语言

R CSV 文件

R 作为统计学专业工具,如果只能人工的导入和导出数据将使其功能变得没有意义,所以 R 支持批量的从主流的表格存储格式文件(例如 CSV、Excel、XML 等)中获取数据。

CSV 表格交互

CSV(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号) 是一种非常流行的表格存储文件格式,这种格式适合储存中型或小型数据规模的数据。

由于大多数软件支持这个文件格式,所以常用于数据的储存与交互。

CSV 本质是文本,它的文件格式极度简单:数据一行一行的用文本保存起来而已,每条记录被分隔符分隔为字段,每条记录都有同样的字段序列。

以下是一个简单的 sites.csv 文件(存储在测试程序的相同目录下):

1
2
3
4
5
id,name,url,likes
1,Google,www.google.com,111
2,Runoob,www.runoob.com,222
3,Taobao,www.taobao.com,333

CSV 用逗号来分割列,如果数据中含有逗号,就要用双引号将整个数据块包括起来。

**注意:**包含非英文字符的文本要注意保存的编码,由于很多计算机普遍使用 UTF-8 编码,所以我是用 UTF-8 进行保存的。

注意: CSV 文件最后一行需要保留一个空行,不然执行程序会有警告信息。

1
2
3
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote, :
incomplete final line found by readTableHeader on 'sites.csv'

读取 CSV 文件

接下来我们就可以使用 read.csv() 函数来读取 CSV 文件的数据:

实例

1
2
data <- read.csv("sites.csv", encoding\="UTF-8")  
print(data)

如果不设置 encoding 属性,read.csv 函数将默认以操作系统默认的文字编码进行读取,如果你使用的是 Windows 中文版系统且没有设置过系统的默认编码,那系统的默认编码应该是 GBK。所以大家请尽可能地统一文字编码以防出错。

执行以上代码输出结果为:

1
2
3
4
  id   name            url likes
1 1 Google www.google.com 111
2 2 Runoob www.runoob.com 222
3 3 Taobao www.taobao.com 333

read.csv() 函数返回的是数据框,我们可以很方便的对数据进行统计处理,以下实例我们查看行数和列数:

实例

1
2
3
4
5
data <- read.csv("sites.csv", encoding\="UTF-8")

print(is.data.frame(data))  \# 查看是否是数据框
print(ncol(data))  \# 列数
print(nrow(data))  \# 行数

执行以上代码输出结果为:

1
2
3
[1] TRUE
[1] 4
[1] 3

以下统计数据框中 likes 字段最大对数据:

实例

1
2
3
4
5
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 最大的数据
like <- max(data$likes)
print(like)

执行以上代码输出结果为:

1
[1] 333

我们也可以指定查找条件,类似 SQL where 子句一样查询数据,需要用到到函数是 subset()

以下实例查找 likes 为 222 到数据:

实例

1
2
3
4
5
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 为 222 的数据
retval <- subset(data, likes \== 222)
print(retval)

执行以上代码输出结果为:

1
2
  id   name            url likes
2 2 Runoob www.runoob.com 222

注意:条件语句等于使用 ==。

多个条件使用 & 分隔符,以下实例查找 likes 大于 1 name 为 Runoob 的数据:

实例

1
2
3
4
5
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 大于 1 name 为 Runoob 的数据
retval <- subset(data, likes \> 1 & name\=="Runoob")
print(retval)

执行以上代码输出结果为:

1
2
  id   name            url likes
2 2 Runoob www.runoob.com 222

保存为 CSV 文件

R 语言可以使用 write.csv() 函数将数据保存为 CSV 文件。

接着以上实例,我们将 likes 为 222 的数据 保存到 runoob.csv 文件:

实例

1
2
3
4
5
6
7
8
9
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 为 222 的数据
retval <- subset(data, likes \== 222)

\# 写入新的文件
write.csv(retval,"runoob.csv")
newdata <- read.csv("runoob.csv")
print(newdata)

执行以上代码输出结果为:

1
2
 X id   name            url likes
1 2 2 Runoob www.runoob.com 222

X 来自数据集 newper,可以通过参数 row.names = FALSE 来删除它:

实例

1
2
3
4
5
6
7
8
9
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 为 222 的数据
retval <- subset(data, likes \== 222)

\# 写入新的文件
write.csv(retval,"runoob.csv", row.names \= FALSE)
newdata <- read.csv("runoob.csv")
print(newdata)

执行以上代码输出结果为:

1
2
  id   name            url likes
1 2 Runoob www.runoob.com 222

执行完后,我们就可以看到 runoob.csv 文件生存:

R Excel 文件

Excel 格式的文件主要是 xls 或 xlsx,这两种文件可以在 R 语言中导入 xlsx 库来实现直接的读取。

R 语言读写 Excel 文件需要安装扩展包,我们可以在 R 到控制台输入以下命令来安装:

1
install.packages("xlsx", repos = "https://mirrors.ustc.edu.cn/CRAN/")

安装过程如下:

事实上,几乎所有的 Excel 软件与大多数表格软件一样支持 CSV 格式的数据,所以完全可以通过 CSV 与 R 交互,没必要再使用 Excel。

查看 xlsx 是否安装成功:

实例

1
2
3
4
5
\# 验证包是否安装  
any(grepl("xlsx",installed.packages()))
\# 载入包
library("xlsx")
library("xlsx")

执行以上代码输出结果为:

1
2
3
4
[1] TRUE
Loading required package: rJava
Loading required package: methods
Loading required package: xlsxjars

Excel 文件数据:

点击链接下载 Excel 测试数据:https://static.jyshare.com/download/sites.xlsx

接下来,我们可以使用 read.xlsx() 函数来读取 Excel 数据:

实例

1
2
3
\# 读取 sites.xlsx 第一个工作表数据  
data <- read.xlsx("sites.xlsx", sheetIndex \= 1)
print(data)

R XML 文件

XML 指的是可扩展标记语言(eXtensible Markup Language),XML 被设计用来传输和存储数据。

如果你对 XML 还不了解,可以先查阅:XML 教程

R 语言读写 XML 文件需要安装扩展包,我们可以在 R 到控制台输入以下命令来安装:

1
install.packages("XML", repos = "https://mirrors.ustc.edu.cn/CRAN/")

查看是否安装成功:

1
2
> any(grepl("XML",installed.packages()))
[1] TRUE

创建 sites.xml 文件,xml 文件与测试脚本同一目录下,代码如下:

实例

1
<sites\> <site\> <id\>1</id\> <name\>Google</name\> <url\>www.google.com</url\> <likes\>111</likes\> </site\> <site\> <id\>2</id\> <name\>Runoob</name\> <url\>www.runoob.com</url\> <likes\>222</likes\> </site\> <site\> <id\>3</id\> <name\>Taobao</name\> <url\>www.taobao.com</url\> <likes\>333</likes\> </site\> </sites\>

接下来我们可以使用 XML 包来载入 xml 文件的数据:

实例

1
2
3
4
5
6
7
8
\# 载入 XML 包  
library("XML")

\# 设置文件名
result <- xmlParse(file \= "sites.xml")

\# 输出结果
print(result)

统计 xml 数据量:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\# 载入 XML 包  
library("XML")

\# 设置文件名
result <- xmlParse(file \= "sites.xml")

\# 提取根节点
rootnode <- xmlRoot(result)

\# 统计数据量
rootsize <- xmlSize(rootnode)

\# 输出结果
print(rootsize)

执行以上代码输出结果为:

1
[1] 3

查看节点数据,某一行使用 [ ], 指定的行和列使用 [[ ]]:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
\# 载入 XML 包  
library("XML")

\# 设置文件名
result <- xmlParse(file \= "sites.xml")

\# 提取根节点
rootnode <- xmlRoot(result)

\# 查看第 2 个节点数据
print(rootnode\[2\])

\# 查看第 2 个节点的第  1 个数据
print(rootnode\[\[2\]\]\[\[1\]\])

\# 查看第 2 个节点的第 3 个数据

print(rootnode\[\[2\]\]\[\[3\]\])

执行以上代码输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
$site
<site>
<id>2</id>
<name>Runoob</name>
<url>www.runoob.com</url>
<likes>222</likes>
</site>

attr(,"class")
[1] "XMLInternalNodeList" "XMLNodeList"
<id>2</id>
<url>www.runoob.com</url>

XML 转为数据列表

以上代码对输出都是 xml 格式,我们使用 xmlToList() 函数可以将文件对数据转为列表格式,更方便读取:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\# 载入 XML 包  
library("XML")

\# 设置文件名
result <- xmlParse(file \= "sites.xml")

\# 转为列表
xml\_data <- xmlToList(result)

print(xml\_data)
print("============================")

\# 输出第一行第二列的数据
print(xml\_data\[\[1\]\]\[\[2\]\])

执行以上代码输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
$site
$site$id
[1] "1"

$site$name
[1] "Google"

$site$url
[1] "www.google.com"

$site$likes
[1] "111"


$site
$site$id
[1] "2"

$site$name
[1] "Runoob"

$site$url
[1] "www.runoob.com"

$site$likes
[1] "222"


$site
$site$id
[1] "3"

$site$name
[1] "Taobao"

$site$url
[1] "www.taobao.com"

$site$likes
[1] "333"


[1] "============================"
[1] "Google"

XML 转为数据框

XML 文件数据可以转为数据框类型,这样我们就更方便对数据进行操作:

实例

1
2
3
4
5
6
\# 载入 XML 包  
library("XML")

\# xml 文件数据转为数据框
xmldataframe <- xmlToDataFrame("sites.xml")
print(xmldataframe)

执行以上代码输出结果为:

1
2
3
4
  id   name            url likes
1 1 Google www.google.com 111
2 2 Runoob www.runoob.com 222
3 3 Taobao www.taobao.com 333

R JSON 文件

JSON: JavaScript Object Notation(JavaScript 对象表示法)。

JSON 是存储和交换文本信息的语法。

JSON 类似 XML,但比 XML 更小、更快,更易解析。

如果你对 JSON 还不了解,可以先查阅:JSON 教程

R 语言读写 JSON 文件需要安装扩展包,我们可以在 R 到控制台输入以下命令来安装:

1
install.packages("rjson", repos = "https://mirrors.ustc.edu.cn/CRAN/")

查看是否安装成功:

1
2
> any(grepl("rjson",installed.packages()))
[1] TRUE

创建 sites.json 文件,json 文件与测试脚本同一目录下,代码如下:

实例

1
{ "id":\["1","2","3"\], "name":\["Google","Runoob","Taobao"\], "url":\["www.google.com","www.runoob.com","www.taobao.com"\], "likes":\[ 111,222,333\] }

接下来我们可以使用 rjson 包来载入 json 文件的数据。

查看数据,某一行使用 [ ], 指定的行和列使用 [[ ]]:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
\# 载入 rjson 包  
library("rjson")

\# 获取 json 数据
result <- fromJSON(file \= "sites.json")

\# 输出结果
print(result)

print("===============")

\# 输出第 1 列的结果
print(result\[1\])

print("===============")
\# 输出第 2 行第 2 列的结果
print(result\[\[2\]\]\[\[2\]\])

执行以上代码输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$id
[1] "1" "2" "3"

$name
[1] "Google" "Runoob" "Taobao"

$url
[1] "www.google.com" "www.runoob.com" "www.taobao.com"

$likes
[1] 111 222 333

[1] "==============="
$id
[1] "1" "2" "3"

[1] "==============="
[1] "Runoob"

我们也可以使用 as.data.frame() 函数将 json 文件数据可以转为数据框类型,这样我们就更方便对数据进行操作:

实例

1
2
3
4
5
6
7
8
9
10
\# 载入 rjson 包  
library("rjson")

\# 获取 json 数据
result <- fromJSON(file \= "sites.json")

\# 转为数据框
json\_data\_frame <- as.data.frame(result)

print(json\_data\_frame)

执行以上代码输出结果为:

1
2
3
4
  id   name            url likes
1 1 Google www.google.com 111
2 2 Runoob www.runoob.com 222
3 3 Taobao www.taobao.com 333

R MySQL 连接

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

如果你对 MySQL 还不了解,可以先查阅:MySQL 教程

R 语言读写 MySQL 文件需要安装扩展包,我们可以在 R 到控制台输入以下命令来安装:

1
install.packages("RMySQL", repos = "https://mirrors.ustc.edu.cn/CRAN/")

查看是否安装成功:

1
2
> any(grepl("RMySQL",installed.packages()))
[1] TRUE

MySQL 目前被甲骨文收购,所以很多人使用来它的复制版本 MariaDB,MariaDB 在 GNU GPL下开源,MariaDB 的开发是由 MySQL 的一些原始开发者领导的,所以语法操作都差不多:

1
install.packages("RMariaDB", repos = "https://mirrors.ustc.edu.cn/CRAN/")

在 test 数据库中创建数据表 runoob,表结构及数据代码如下:

实例

1
\-- -- 表的结构 \`runoob\` \-- CREATE TABLE \`runoob\` ( \`id\` int(11) NOT NULL, \`name\` char(20) NOT NULL, \`url\` varchar(255) NOT NULL, \`likes\` int(11) NOT NULL ) ENGINE\=InnoDB DEFAULT CHARSET\=utf8mb4; \-- -- 转存表中的数据 \`runoob\` \-- INSERT INTO \`runoob\` (\`id\`, \`name\`, \`url\`, \`likes\`) VALUES (1, 'Google', 'www.google.com', 111), (2, 'Runoob', 'www.runoob.com', 222), (3, 'Taobao', 'www.taobao.com', 333);

接下来我们可以使用 RMySQL 包来读取数据:

实例

1
2
3
4
5
6
7
library(RMySQL)

\# dbname 为数据库名,这边的参数请根据自己实际情况填写
mysqlconnection \= dbConnect(MySQL(), user \= 'root', password \= '', dbname \= 'test',host \= 'localhost')

\# 查看数据
dbListTables(mysqlconnection)

接下来我们可以使用 dbSendQuery 来读取数据库的表,结果集通过 fetch() 函数来获取:

实例

1
2
3
4
5
6
7
library(RMySQL)  
\# 查询 sites 表,增删改查操作可以通过第二个参数的 SQL 语句来实现
result \= dbSendQuery(mysqlconnection, "select \* from sites")

\# 获取前面两行数据
data.frame \= fetch(result, n \= 2)
print(data.frame)

留言與分享

  • 第 1 頁 共 1 頁
作者的圖片

Kein Chan

這是獨立全棧工程師Kein Chan的技術博客
分享一些技術教程,命令備忘(cheat-sheet)等


全棧工程師
資深技術顧問
數據科學家
Hit廣島觀光大使


Tokyo/Macau