【问题标题】:Specifying colClasses in read.table using the class function使用类函数在 read.table 中指定 colClasses
【发布时间】:2015-06-26 16:41:17
【问题描述】:

有没有办法使用read.table()读取里面的全部或部分文件,使用类函数获取列类型,修改列类型,然后重新读取文件?

基本上我的列是零填充整数,我喜欢将其视为字符串。如果我让read.table() 做它的事情,它当然会假设这些是数字并去掉前导零并使列类型为整数。事情是我有相当多的列,所以虽然我可以创建一个字符向量来指定每个列,但我只想从 R 的最佳猜测中更改几个。我想做的是阅读前几行:

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" 那么有什么问题呢?

【问题讨论】:

  • 如果您有 N 列,并且只想强制第 3 和第 7 为字符,例如,可能类似于 col_classes &lt;- rep(NA, N); col_classes[c(3, 7)] &lt;- "character",然后您将其作为 colClasses 参数传递.在帮助文件中,[Re: colClasses]: "... Possible values are NA (the default, when type.convert is used) ..."

标签: r read.table


【解决方案1】:

您使用read.tables colClasses = 参数来指定要分类为characters 的列。例如:

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

【讨论】:

  • 我正在寻找一种速记方式。在我真正的问题中,我有几百列,并且我对 R 的大多数默认列类型感到满意,所以当我只想更改一对时,似乎不得不指定整个内容。
  • 我怀疑它总是令人讨厌但很少有用的行名业务,但行名不是实际的列,所以我不能删除它。
  • 我想我明白你的意思了。希望我能用编辑后的答案更好地解决问题。不确定它是否有效,但它可能适合您的需求。
  • 像魅力一样工作,使用列名可能比索引更好。
猜你喜欢
  • 2014-12-04
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
相关资源
最近更新 更多