2015-06-26 33 views
0

是否有办法使用read.table()来读取全部或部分文件,使用类函数获取列类型,修改列类型,然后重新读取文件?使用类函数在read.table中指定colClasses

基本上我有零填充整数,我喜欢作为字符串对待列。如果我让read.table()只是做它的事情,它当然认为这些是数字和剥离前导零,并使列类型的整数。事情是我有相当数量的列,所以虽然我可以创建一个字符向量指定每个我只想改变一个夫妇从最好的猜测是。我希望做的是阅读的头几行:

myTable <- read.table("//myFile.txt", sep="\t", quote="\"", header=TRUE, stringsAsFactors=FALSE, nrows = 5) 

然后得到列类:

colTypes <- sapply(myTable, class) 

更改了几个列类型,即:

colTypes[1] <- "character" 

而且然后使用修改的列类型重新读取文件:

myTable <- read.table("//myFile.txt", sep="\t", quote="\"", colClasses=colTypes, header=TRUE, stringsAsFactors=FALSE, nrows = 5) 

虽然这似乎是一个合理的无限事情,和colTypes = c("character")工作正常,当我真正尝试它,我得到一个:

scan() expected 'an integer', got '"000001"' 

class(colTypes)class(c("character"))都返回"character"有啥问题?

+0

如果你有'N'列,并要强制例如,只有第三和第七是字符,可能类似于'col_classes < - rep(NA,N); col_classes [c(3,7)] < - “字符”,然后您将作为colClasses参数传递。从帮助文件中,[Re:colClasses]:“...可能的值是NA(使用type.convert时的默认值)...”' – nrussell

回答

0

您使用read.table s colClasses =参数指定要分类为character s的列。例如:

txt <- 
"var1, var2, var3 
0001, 0002, 1 
0003, 0004, 2" 
df <- 
read.table(
    text = txt, 
    sep = ",", 
    header = TRUE, 
    colClasses = "character") ## read all as characters 
df  
df2 <- 
read.table(
    text = txt, 
    sep = ",", 
    header = TRUE, 
    colClasses = c("character", "character", "double")) ## the third column is numeric 
df2 

[更新中...]或者,您可以设置和重新设置colClasses用向量...

df <- 
read.table(
    text = txt, 
    sep = ",", 
    header = TRUE) 
df 

## they're all currently read as integer 
myColClasses <- 
sapply(df, class) 

## create a vector of column names for zero padded variable 
zero_padded <-  
c("var1", "var2") 

## if a name is in zero_padded, return "character", else leave it be 
myColClasses <- 
ifelse(names(myColClasses) %in% zero_padded, 
     "character", 
     myColClasses) 

## read in with colClasses set to myColClasses 
df2 <- 
read.table(
    text = txt, 
    sep = ",", 
    colClasses = myColClasses, 
    header = TRUE) 
df2 
+0

我正在寻找一种简写方式。在我真正的问题中,我有几百列,我对R的大多数默认列类型感到满意,所以当我只想改变一对夫妇时,似乎疯狂地指定了整个事情。 –

+0

我怀疑这是总是恼人的,但很少有用的行名业务,但行名不是一个实际的列,所以我不能放弃它。 –

+0

我想我明白你的意思了。希望我能更好地解决所编辑的答案。不确定它是否有效,但它可能适合您的需求。 – Kevin