R- 我的第一行的列名中有 # 字符?
R- my first row has # character in the column names?
我的测试文件格式很奇怪。
第一行以:
开头
如果我忽略第一行并使用 read.table 导入数据,效果很好,但我没有列名。但是,如果我尝试使用 col.names=TRUE 导入数据,它会显示“ 列多于列名 ”。我想我可以分别导入第一行和其余数据,并将第一行(即列名)添加到最终输出文件中。但是当我导入第一行时:它完全忽略列名并跳转到带有 0 0 0 0... 的行。是因为第一行有一个 # 字符。而且由于 # 字符,数据中还有一个额外的空列。
一种方法是只单独读取第一行以嗅出列名。然后,像您已经做的那样做 read.table
,并跳过第一行。
f <- "path/to/yourfile.csv"
con <- file(f, "r")
header <- readLines(con, n=1)
close(con)
df <- read.table(f, header=FALSE, sep = " ", skip=1) # skip the first line
names(df) <- strsplit(header, "\s+")[[1]][-1] # assign column names
但是,我不喜欢这种方法,宁愿您将平面文件的源修复为不包括那个麻烦的#
符号。此外,如果您一次性只需要此要求,您也可以手动编辑平面文件以删除 #
符号。
这里有几种可能性:
1) 处理两次 使用readLines
将其作为行的字符向量读入,L
。然后删除 # 并使用 read.table
:
读取 L
L <- sub("#", "", readLines("myfile.dat"))
read.table(text = L, header = TRUE)
2) 单独阅读 header 对于较小的文件,先前的方法很短并且应该没问题,但如果文件很大,您可能不想处理它两次.在这种情况下,使用 readLines
仅读入 header 行,修复它,然后应用列名读入其余部分。
File <- "myfile.dat"
col.names <- scan(text = readLines(File, 1), what = "", quiet = TRUE)[-1]
read.table(File, col.names = col.names)
3) pipe 另一种方法是利用外部命令:
File <- "myfile.dat"
cmd <- paste("sed -e 1s/.//", File)
read.table(pipe(cmd), header = TRUE)
在 UNIX-like 系统上 sed
应该可用。在 Windows 上,您需要安装 Rtools 并确保 sed
在 PATH
上,否则使用文件路径:
cmd <- paste("C:/Rtools/bin/sed -e 1s/.//", File)
read.table(pipe(cmd), header = TRUE)
我的测试文件格式很奇怪。 第一行以:
开头一种方法是只单独读取第一行以嗅出列名。然后,像您已经做的那样做 read.table
,并跳过第一行。
f <- "path/to/yourfile.csv"
con <- file(f, "r")
header <- readLines(con, n=1)
close(con)
df <- read.table(f, header=FALSE, sep = " ", skip=1) # skip the first line
names(df) <- strsplit(header, "\s+")[[1]][-1] # assign column names
但是,我不喜欢这种方法,宁愿您将平面文件的源修复为不包括那个麻烦的#
符号。此外,如果您一次性只需要此要求,您也可以手动编辑平面文件以删除 #
符号。
这里有几种可能性:
1) 处理两次 使用readLines
将其作为行的字符向量读入,L
。然后删除 # 并使用 read.table
:
L
L <- sub("#", "", readLines("myfile.dat"))
read.table(text = L, header = TRUE)
2) 单独阅读 header 对于较小的文件,先前的方法很短并且应该没问题,但如果文件很大,您可能不想处理它两次.在这种情况下,使用 readLines
仅读入 header 行,修复它,然后应用列名读入其余部分。
File <- "myfile.dat"
col.names <- scan(text = readLines(File, 1), what = "", quiet = TRUE)[-1]
read.table(File, col.names = col.names)
3) pipe 另一种方法是利用外部命令:
File <- "myfile.dat"
cmd <- paste("sed -e 1s/.//", File)
read.table(pipe(cmd), header = TRUE)
在 UNIX-like 系统上 sed
应该可用。在 Windows 上,您需要安装 Rtools 并确保 sed
在 PATH
上,否则使用文件路径:
cmd <- paste("C:/Rtools/bin/sed -e 1s/.//", File)
read.table(pipe(cmd), header = TRUE)