最近用之前写的R
脚本重新跑数据时,出现了报错。经检查,才发现是数据的列名读入R
时发生了变化,列名前自动加上了X.
符号。
read.table
系列函数有一个check.names
参数,默认为 TRUE
,因此读入数据时它会自动检查变量名在R
中是否有效。如果变量名包含首字母为数字、#
、$
等情况时,则会自动加上X.
,使变量看上去更像一个字符型变量。
check.names
是通过调用make.names
函数来实现增加字符这一过程的,如列名为1,2, 3, 4, 5,6
时,会自动加上X
。
make.names(c("1", "2", "3", "4", "5", "6"))
[1] "X1" "X2" "X3" "X4" "X5" "X6"
但这往往不是我们希望的,因为变量名已经改变了, 就只能通过转换后的变量来访问对应数据。为了让列名称和原始的一致,在read.table
时,可以设置check.names=F
。
补充
read.table参数解读:
read.table(file, header = FALSE, sep = "", quote = "\"'",
dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
row.names, col.names, as.is = !stringsAsFactors,
na.strings = "NA", colClasses = NA, nrows = -1,
skip = 0, check.names = TRUE, fill = !blank.lines.skip,
strip.white = FALSE, blank.lines.skip = TRUE,
comment.char = "#",
allowEscapes = FALSE, flush = FALSE,
stringsAsFactors = default.stringsAsFactors(),
fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)
file
指定读入的文件header
是否有列名(默认无)seq
指定分隔符(空格、TAB、换行符、回车符)quote
制定包围字符型数据的字符。默认情况下,字符串可以被 " 或 ’ 括起,并且两种情况下,引号内部的字符都作为字符串的一部分。有效的引用字符(可能没有)的设置由参数quote
控制。默认值改为quote = ""
dec = "."
指定小数点数colClasses
指定列的数据类型格式row.names
指定各行名称,也可以是数字,指定某列为行名col.names
指定各列名称as.is = !stringsAsFactors as.is
字符向量是否转换成因子(仅仅这个功能),TRUE
时保留为字符型na.strings = "NA"
指定什么样的字符表示值缺少colClasses = NA colClasses
运行为输入中的每个列设置需要的类型。注意,colClasses
和as.is
对每 列专用,而不是每个变量。因此,它对行标签列也同样适用(如果有的话)。nrows = -1
最大读入行数,即读入前多少行,“-1”表示都读入
skip = 0
跳过文件的前n行(skip = n
)check.names = TRUE
# 检查变量名在R
中是否有效fill = !blank.lines.skip
从一个电子表格中导出的文件通常会把拖尾的空字段(包括?堑姆指舴? 忽略掉。为了读取这样的文件,必须设置参数 fill = TRUEstrip.white = FALSE
如果设定了分隔符,字符字段起始和收尾处的空白会作为字段一部分看待的。为了去掉这些空白,可以使用参数strip.white = TRUE
blank.lines.skip = TRUE
默认情况下,read.table
忽略空白行。这可以通过设置blank.lines.skip = FALSE
来改变。但这个参数只有在和fill = TRUE
共同使用时才有效。这时,可能是用空白行表明规则数据中的缺损样本。comment.char = "#"
默认情况下,read.table
用#
作为注释标识字符。如果碰到该字符(除了在被引用的字符串内),该行中随后的内容将会被忽略。只含有空白和注释的行被当作空白行。如果确认数据文件中没有注释内容,用comment.char = ""
会比较安全 (也可能让速度比较快)。allowEscapes = FALSE
read.table
和scan
都有一个逻辑参数allowEscapes
。从R 2.2.0
开始,该参数默认为否,而且反斜杠是唯一被解释为逃逸引用符的字符。如果该参数设为是,以C形式的逃逸规则解释,也就是控制符如八进制和十六进制如40
和x2A
一样描述。
Ref:
https://www.cnblogs.com/steamed-bread/p/5560641.html
https://www.cnblogs.com/xudongliang/p/5141459.html