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 并确保 sedPATH 上,否则使用文件路径:

cmd <- paste("C:/Rtools/bin/sed -e 1s/.//", File)
read.table(pipe(cmd), header = TRUE)