R语言学习笔记(11)-数据获取、读入&写入
参考视频:(28 29 30)
https://www.bilibili.com/video/BV19x411X7C6?p=28
https://www.bilibili.com/video/BV19x411X7C6?p=29
一、获取数据
-
三种途径
(1)利用键盘来输入数据
eg.输入病例数据
病例数据.png
#每一列用一个变量存储起来
> patientID <- c(1,2,3,4)
> admdate <- c("10/15/2009","11/01/2009","10/21/2009","10/28/2009")
> age <- c(25, 34, 28, 52)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")
> status <- c("Poor", "Improved", "Excellent", "Poor")
#生成数据框
> data <- data.frame(patientID, age, diabetes, status)
> data
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
edit():自动调用一个允许手动输入的文本编辑器。需要首先定义一个变量,然后用edit()修改这个变量,否则输入的数据无法保存
> data2 <- data.frame(patientID=character(0), age=numeric(0),
+ diabetes=character(), status=character())
> data2 <- edit(data2)
![](https://img.haomeiwen.com/i19791022/36325e8dc4368e6d.png)
将数据输入到编辑框中,编辑完成后关闭即可,数据便会保存到刚才的变量中。
若没有提前定义变量,数据便无法保存
若是在Linux系统下,则会打开vim编辑器,用空格分隔即可。
如果想修改数据,再调用edit,修改后赋值给原变量即可
fix()函数也可修改,可直接保存
(2)通过读取存储在外部文件上的数据
利用R读取的文件,最好是经过处理适合R使用的文件。可利用Python、Perl来对数据进行预处理,然后将统计结果导入R进行分析。
(3)通过访问数据库系统来获取数据
在R中,可通过ODBC(open database connectivity)访问数据库。可用R读取数据库内容,同时还可将R处理后的结果写入到数据库内。
还可通过DBI包访问数据库,可实现通过驱动程序连接至数据库,为不同数据库提供了一种通用语法。
要使用某种数据库,需要下载其与DBI相连的包才能使用。
> install.packages("RODBC")
二、读入文件
1.read.table
![](https://img.haomeiwen.com/i19791022/704016db426f2336.png)
![](https://img.haomeiwen.com/i19791022/7062981d45fb01a2.png)
(1)file
#纯文本文件 .txt
>read.table("input.txt")
#读入文件
> x <- read.table("input.txt")//R默认给每一行添加行号
#文件内容较大,可使用head()、tail()来截取文件头部和尾部固定行数,默认为六行。
> head(x)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> tail(x)
Ozone Solar.R Wind Temp Month Day
148 14 20 16.6 63 9 25
149 30 193 6.9 70 9 26
150 NA 145 13.2 77 9 27
151 14 191 14.3 75 9 28
152 18 131 8.0 76 9 29
153 20 223 11.5 68 9 30
> head(x, n = 10)
> head(x,n = 10)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
10 NA 194 8.6 69 5 10
#若文件不在该目录下,可使用全路径(绝对or相对路径),必须是完整文件路径,无法读取目录
(2)sep指定分隔符
> x <- read.table("input.csv")
#不设置,则很乱
> x
V1
1
2 Mazda RX4
3 Mazda RX4 Wag
4 Datsun 710
5 Hornet 4 Drive
6 Hornet Sportabout
7 Valiant
8 Duster 360
9 Merc 240D
10 Merc 230
11 Merc 280
12 Merc 280C
13 Merc 450SE
14 Merc 450SL
15 Merc 450SLC
16 Cadillac Fleetwood
17 Lincoln Continental
18 Chrysler Imperial
19 Fiat 128
20 Honda Civic
21 Toyota Corolla
22 Toyota Corona
23 Dodge Challenger
24 AMC Javelin
25 Camaro Z28
26 Pontiac Firebird
27 Fiat X1-9
28 Porsche 914-2
29 Lotus Europa
30 Ford Pantera L
31 Ferrari Dino
32 Maserati Bora
33 Volvo 142E
V2
1 ,"mpg","cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb"
2 ,21,6,160,110,3.9,2.62,16.46,0,1,4,4
3 ,21,6,160,110,3.9,2.875,17.02,0,1,4,4
4 ,22.8,4,108,93,3.85,2.32,18.61,1,1,4,1
5 ,21.4,6,258,110,3.08,3.215,19.44,1,0,3,1
6 ,18.7,8,360,175,3.15,3.44,17.02,0,0,3,2
7 ,18.1,6,225,105,2.76,3.46,20.22,1,0,3,1
8 ,14.3,8,360,245,3.21,3.57,15.84,0,0,3,4
9 ,24.4,4,146.7,62,3.69,3.19,20,1,0,4,2
10 ,22.8,4,140.8,95,3.92,3.15,22.9,1,0,4,2
11 ,19.2,6,167.6,123,3.92,3.44,18.3,1,0,4,4
12 ,17.8,6,167.6,123,3.92,3.44,18.9,1,0,4,4
13 ,16.4,8,275.8,180,3.07,4.07,17.4,0,0,3,3
14 ,17.3,8,275.8,180,3.07,3.73,17.6,0,0,3,3
15 ,15.2,8,275.8,180,3.07,3.78,18,0,0,3,3
16 ,10.4,8,472,205,2.93,5.25,17.98,0,0,3,4
17 ,10.4,8,460,215,3,5.424,17.82,0,0,3,4
18 ,14.7,8,440,230,3.23,5.345,17.42,0,0,3,4
19 ,32.4,4,78.7,66,4.08,2.2,19.47,1,1,4,1
20 ,30.4,4,75.7,52,4.93,1.615,18.52,1,1,4,2
21 ,33.9,4,71.1,65,4.22,1.835,19.9,1,1,4,1
22 ,21.5,4,120.1,97,3.7,2.465,20.01,1,0,3,1
23 ,15.5,8,318,150,2.76,3.52,16.87,0,0,3,2
24 ,15.2,8,304,150,3.15,3.435,17.3,0,0,3,2
25 ,13.3,8,350,245,3.73,3.84,15.41,0,0,3,4
26 ,19.2,8,400,175,3.08,3.845,17.05,0,0,3,2
27 ,27.3,4,79,66,4.08,1.935,18.9,1,1,4,1
28 ,26,4,120.3,91,4.43,2.14,16.7,0,1,5,2
29 ,30.4,4,95.1,113,3.77,1.513,16.9,1,1,5,2
30 ,15.8,8,351,264,4.22,3.17,14.5,0,1,5,4
31 ,19.7,6,145,175,3.62,2.77,15.5,0,1,5,6
32 ,15,8,301,335,3.54,3.57,14.6,0,1,5,8
33 ,21.4,4,121,109,4.11,2.78,18.6,1,1,4,2
> x <- read.table("input.csv",sep = ",")
> x
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
1 mpg cyl disp hp drat wt qsec vs am gear carb
2 Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
3 Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
4 Datsun 710 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
5 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
6 Hornet Sportabout 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2
7 Valiant 18.1 6 225 105 2.76 3.46 20.22 1 0 3 1
8 Duster 360 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4
9 Merc 240D 24.4 4 146.7 62 3.69 3.19 20 1 0 4 2
10 Merc 230 22.8 4 140.8 95 3.92 3.15 22.9 1 0 4 2
11 Merc 280 19.2 6 167.6 123 3.92 3.44 18.3 1 0 4 4
12 Merc 280C 17.8 6 167.6 123 3.92 3.44 18.9 1 0 4 4
13 Merc 450SE 16.4 8 275.8 180 3.07 4.07 17.4 0 0 3 3
14 Merc 450SL 17.3 8 275.8 180 3.07 3.73 17.6 0 0 3 3
15 Merc 450SLC 15.2 8 275.8 180 3.07 3.78 18 0 0 3 3
16 Cadillac Fleetwood 10.4 8 472 205 2.93 5.25 17.98 0 0 3 4
17 Lincoln Continental 10.4 8 460 215 3 5.424 17.82 0 0 3 4
18 Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4
19 Fiat 128 32.4 4 78.7 66 4.08 2.2 19.47 1 1 4 1
20 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
21 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.9 1 1 4 1
22 Toyota Corona 21.5 4 120.1 97 3.7 2.465 20.01 1 0 3 1
23 Dodge Challenger 15.5 8 318 150 2.76 3.52 16.87 0 0 3 2
24 AMC Javelin 15.2 8 304 150 3.15 3.435 17.3 0 0 3 2
25 Camaro Z28 13.3 8 350 245 3.73 3.84 15.41 0 0 3 4
26 Pontiac Firebird 19.2 8 400 175 3.08 3.845 17.05 0 0 3 2
27 Fiat X1-9 27.3 4 79 66 4.08 1.935 18.9 1 1 4 1
28 Porsche 914-2 26 4 120.3 91 4.43 2.14 16.7 0 1 5 2
29 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
30 Ford Pantera L 15.8 8 351 264 4.22 3.17 14.5 0 1 5 4
31 Ferrari Dino 19.7 6 145 175 3.62 2.77 15.5 0 1 5 6
32 Maserati Bora 15 8 301 335 3.54 3.57 14.6 0 1 5 8
33 Volvo 142E 21.4 4 121 109 4.11 2.78 18.6 1 1 4 2
(3)header 若第一行是变量名称,header = TRUE
> read.table("input 1.txt",header = TRUE)
(4)skip 控制从哪一行开始读
read.table("input 1.txt",header = TRUE,skip = 5)
(5)nrow 读取文件行数
只想读取文件部分内容,skip+nrow,读取任何部分
#读取文件的第51行-第250行
> read.table("input 1.txt",header = TRUE,skip = 50,nrow = 200)
(6)stringsAsFactors 控制读入字符串是否转化为因子
R在读取数据时,数字会读取称数值型数据;读取字符串时,R默认将所有字符串转化为因子类型。但很多情况下不需要这种转换,需要将stringAsFactors设置为false
其他read系列读取函数
read.csv(默认分隔符为逗号)、
read.delim(默认使用制表符分割)
read.fwf(读取固定跨度的文件,每一列都开始于一个特定的位置)还要给出每一列所占有的宽度值
-
若文件不在本机,R还支持读取网络文件
需要将文件名修改为对应网址,可以是http ftp,可以是局域网内file开头的完整地址 -
读取非文本文件
(1)HTML文件,可以使用XML包
readHTMLTable可用来读取网页中的数据,网页中大量内容可用grep、discard来进行筛选。
若只读取表格数据,可使用which参数。eg.which = 3,只读取网页中第三个表格
> install.packages("XML")
> library(XML)
(2)转化成csv文件
如一个Excel文件,另存为-存储为csv格式
(3)foreign包
![](https://img.haomeiwen.com/i19791022/9a18d8826cb47ced.png)
(4)其他格式
若遇到其他foreign包不支持格式的文件,则可存储为文本文件或者搜索R中对应的包。
eg.想要处理matlab格式文件,则可用RSiteSearch()进行网络搜索
(5)剪切板上的数据
#首先复制数据到剪切板
> x <- read.table("clipboard",header = T,sep = ",")
#或是使用readClipboard()函数
> readClipboard()
(6)压缩文件(无需解压缩)
R可以直接读取
> read.table(gzfile("input.txt.gz"))
(7)不规则格式文件
函数:readLines()、scan()
#readLines() 参数n,限制读入的最大行数
> readLines("input.csv", n = 15)
#scan()每次读取一个单元,并根据指令进行处理。
#what:scan所期望读取文件的单元。
![scan.png](https://img.haomeiwen.com/i19791022/7b17eaef521ba801.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> scan("scan.txt",what = list(character(3),numeric(0),numeric(0)))
Read 20 records
[[1]]
[1] "one" "four" "one" "four" "one" "four" "one" "four" "one" "four" "one"
[12] "four" "one" "four" "one" "four" "one" "four" "one" "four"
[[2]]
[1] 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5
[[3]]
[1] 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6
> scan("scan.txt",what = list(character(3),numeric(2),numeric(2)))
Read 20 records
[[1]]
[1] "one" "four" "one" "four" "one" "four" "one" "four" "one" "four" "one"
[12] "four" "one" "four" "one" "four" "one" "four" "one" "four"
[[2]]
[1] 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5 2 5
[[3]]
[1] 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6
三、写入文件
-
write()
与read系列函数相对应
cat():将数据显示在屏幕
write():将数据写入文件
write.png
若为数据框,则使用write.table()
若写入csv文件,则使用write.csv()
(1)参数
- x:要存储的R对象,可以是向量、矩阵、数据框
- file:写入的文件名,不加路径名则存储在当前工作目录下(目录必须存在)
- sep:指定新的分割符
在这个过程中,会自动加入行号,若多次读入则会加若干次行号
解决方法为:命令加一个row.names = false - append:将数据写入同一个文件(以免同名文件覆盖),设置为TRUE or FALSE
(2)可直接写入压缩文件
> write.table(mtcars,gzfile("newfile.txt.gz"))
(3)借助foreign()