【发布时间】:2014-09-20 08:49:11
【问题描述】:
我从一个大文件中对数据进行了子集化,并发现 X 添加到数据的每个列名称中。我使用 write.csv 写入数据,从外部打开并手动从每一列中删除 X 并保存文件。现在,当我再次阅读此文件时,X 仍然存在于列名中。示例:X2001、X2002、X2004 等。
【问题讨论】:
标签: r
我从一个大文件中对数据进行了子集化,并发现 X 添加到数据的每个列名称中。我使用 write.csv 写入数据,从外部打开并手动从每一列中删除 X 并保存文件。现在,当我再次阅读此文件时,X 仍然存在于列名中。示例:X2001、X2002、X2004 等。
【问题讨论】:
标签: r
您可以在这里查看差异:
dat1 <- read.table(text="2001 2002
45 32
46 35",sep="",header=TRUE)
和
dat2<- read.table(text="2001 2002
45 32
46 35",sep="",header=TRUE, check.names=FALSE)
colnames(dat1) #it is because by default `R` doesn't allow colnames that start with numbers
#[1] "X2001" "X2002"
colnames(dat2)
#[1] "2001" "2002"
我会说最好不要使用check.names=FALSE,因为
dat2$2001
#Error: unexpected numeric constant in "dat2$2001"
当然你可以使用backticks来避免错误
dat2$`2001`
#[1] 45 46
在read.table 代码中,make.names 参数正在创建X
if (check.names)
col.names <- make.names(col.names, unique = TRUE)
例如:
make.names(c("2001", "2002"), unique=TRUE)
#[1] "X2001" "X2002"
【讨论】:
check.names 是最直接的方法。我不知道你说的永久解决是什么意思?
read.table 的代码,因为check.names 使用make.names。不过,我不明白为什么在 read.table 中传递 check.names 参数如此困难?
Guarav,如果您不想一直设置check.names,请包装read.table(我不建议修改read.table 代码本身)。
read.table.raw.names <- function(...) {
args <- list(...)
if ("check.names" %in% names(args)) stop("Function does not require check.names to be set")
read.table(...,check.names=F)
}
然后,按照akrun的例子
dat1 <- read.table.raw.names(text="2001 2002
45 32
46 35",sep="",header=TRUE)
colnames(dat1)
#[1] "2001" "2002"
【讨论】: