R读入数据之read.table函数
写在最前:
- read.table()函数适合读入文本文件储存的表格数据(*.txt *.csv *.xls等)
- 看完解决90%读数据的问题:
1.正常输入
2.中文字符
3.表头问题
4.elements数不足
5.缺失值
1.首先看一下正常的输入文件,需要重点关注
- 是否含有表头
-
表格的分隔符是什么
df <- read.table(file = "grade.txt",
sep = "/t",
header = T)
> df
name Chinese Math English
1 zhang 98 78 56
2 Wang 78 27 88
3 Ming 84 29 45
4 Bai 100 93 75
经过read.table()
函数选择文件、设置分隔符、选择包含表头的操作,在R中得到了一个"正常"的数据框。
2.中文字符
如果输入文件内容中含有中文,则会变成乱码
df <- read.table(file = "成绩.txt",
sep = "/t",
header = T)
> df
濮撳悕 璇.枃 鏁板. 鑻辫.
1 鑰佸紶 98 78 56
2 鑰佺帇 78 27 88
3 灏忔槑 84 29 45
4 灏忕櫧 100 93 75
更改参数fileEncoding
设置为“UTF-8”编码可以完美解决
df <- read.table(file = "成绩.txt",
sep = "/t",
header = T,
fileEncoding = "UTF-8")
> df
姓名 语文 数学 英语
1 老张 98 78 56
2 老王 78 27 88
3 小明 84 29 45
4 小白 100 93 75
3.表头问题
如果表头设置错了(明明有表头,读入的时候选择了没有),就会变成这样:
df <- read.table(file = "grade.txt",
sep = "/t",
header = F)
> df
V1 V2 V3 V4
1 name Chinese Math English
2 zhang 98 78 56
3 Wang 78 27 88
4 Ming 84 29 45
5 Bai 100 93 75
可以看出read.table()
输出的数据框会自动添加列名:V1、V2、V3···
但如果很不幸,你的输入数据表头含有以下奇怪字符,像这样:
df <- read.table(file = "grade.txt",
sep = "/t",
header = T)
> df
name Chinese.1 Chinese.2 Chinese.3
1 zhang 98 78 56
2 Wang 78 27 88
3 Ming 84 29 45
4 Bai 100 93 75
由于read.table
函数会自动check列名,因此奇怪的列名会变得规范很多。但更规范的列名有可能和你的预期不一致,比如你就想保留这些奇怪的字符。
将check.names
参数设置为FALSE,把这个功能关掉
df <- read.table(file = "grade.txt",
sep = "/t",
header = T,
check.names = F)
> df
name Chinese-1 Chinese:2 Chinese@3
1 zhang 98 78 56
2 Wang 78 27 88
3 Ming 84 29 45
4 Bai 100 93 75
4.报错:某行elements数不足
有时候文件看着没啥问题,却出现以下类似错误
原因1:有的内容含有#
由于read.table()
函数会默认把#后面的字符识别为注释,使用comment.char = ""
禁用该功能。
df <- read.table(file = "grade.txt",
sep = "/t",
header = T,
check.names = F,
comment.char = "")
> df
name Chinese-1 Chinese:2 Chinese@3
1 zhang 98 78 56
2 Wang 78 27 88
3 Ming 84 29# 45
4 Bai 100 93 75
原因2:有的内容含有"
read.table()
函数会默认把双引号引起来的内容识别为一部分,使用quote = ""
禁用该功能
df <- read.table(file = "grade.txt",
sep = "/t",
header = T,
check.names = F,
quote = "")
> df
name Chinese-1 Chinese:2 Chinese@3
1 zhang 98 78 56
2 Wang 78 27 88
3 Ming "84 "29 "45
4 Bai 100 93 75
5.缺失值
情况1:有些内容在记录时可能被空缺
> df
name Chinese-1 Chinese:2 Chinese@3
1 zhang 98 78 56
2 Wang 78 88
3 Ming "84 "29 "45
4 Bai 100 93 75
> df[2,3]
[1] ""
空缺值在R中会被记录为空字符串,可能不方便后续分析处理
情况2:某内容空缺,并被记录为NA
df <- read.table(file = "grade.txt",
sep = "/t",
header = T,
check.names = F,
quote = "",
na.strings = "NA")
> df
name Chinese-1 Chinese:2 Chinese@3
1 zhang 98 78 56
2 Wang 78 88
3 Ming "84 "29 "45
4 Bai 100 93 75
默认情况下,read.table()
函数会将记录为"NA"的内容转化为NA
缺失值被记录na
可以使用na.strings
参数设置识别缺失值的内容
df <- read.table(file = "grade.txt",
sep = "/t",
header = T,
check.names = F,
quote = "",
na.strings = "na")
> df
name Chinese-1 Chinese:2 Chinese@3
1 zhang 98 78 56
2 Wang 78 NA
3 Ming "84 "29 "45
4 Bai 100 93 75
> df[2,3]
[1] "NA"
> df[2,4]
[1] NA
可以看到内容NA被正确读入,内容na被正确识别为NA。并且字符串NA和缺失值NA也可以被明显的区分出来。
共有 0 条评论