【问题标题】:Read numeric input as string R将数字输入读取为字符串 R
【发布时间】:2017-06-28 13:47:11
【问题描述】:

所以,我有这个表单的输入 csv,

id,No.,V,S,D
1,0100000109,623,233,331
2,0200000109,515,413,314
3,0600000109,611,266,662

我需要按原样阅读编号列(即作为一个字符)。我知道我可以使用这样的东西:

data <- read.csv("input.csv", colClasses = c("MSISDN" = "character"))

我有一个代码,用于分块读取 csv 文件:

chunk_size <- 2
con  <- file("input.csv", open = "r")
data_frame <- read.csv(con,nrows = chunk_size,colClasses = c("MSISDN" =   "character"),quote="",header = TRUE,)
header <- names(data_frame)
print(header)
print(data_frame)
if(nrow(data_frame) == chunk_size) {
repeat {
data_frame <- read.csv(con,nrows = chunk_size, header = FALSE, quote="")
names(data_frame)<-c(header)
print(header)
print(data_frame)
if(nrow(data_frame) < chunk_size) {
  break
}
}
}

close(con)

但是,我面临的问题是,第一个块只会读取编号列作为字符,其余块不会。

我该如何解决这个问题?

PS:原始输入文件大约有 150 多列和大约 2000 万行。

【问题讨论】:

  • 为什么要分块阅读?
  • 你最终的read.csv 不像其他两个那样使用colClasses。
  • @Remko 在最终的 read.csv 中我无法添加 colClasses,因为我在该语句中设置了 header=false。
  • 一个直接的解决方案是使用readLines 以字符串形式读取文件,并使用split 获取列...
  • @holzben你能详细说明一下吗,我对 R 还很陌生

标签: r


【解决方案1】:

您需要在 repeat 过程中的 read.csv() 中提供列类型 colClasses。 您不再拥有标题,因此您需要定义一个未命名的向量来指定 colClasses。 假设 colClasses 的大小是 150。

myColClasses=rep("numeric",150) myColClasses[2] <- "character" repeat { data_frame <- read.csv(con,nrows = chunk_size, colClasses=myColClasses, header = FALSE, quote="") ...

【讨论】:

  • 我提供的输入只是一个示例。原始文件包含大约 150 多列。那时使用您的解决方案将非常困难。有没有其他办法?
【解决方案2】:

您可以使用readLines 将数据读取为字符串并将其拆分:

fileName <- "input.csv"
df <- do.call(rbind.data.frame, strsplit(readLines(fileName), ",")[-1]) # skipping headlines
colnames(df) <- c("id","No.","V","S","D") #adding headlines

或直接使用read.csv:

fileName <- "input.csv"
col <- c("integer","character","integer","integer","integer")
df <- read.csv(file = fileName,
               sep = ",", 
               colClasses=col, 
               header = TRUE, 
               stringsAsFactors = FALSE)

【讨论】:

  • 正如我在问题中已经提到的,输入文件包含大约 150 多列,手动为所有列标题添加数据类型非常困难。
  • 在我的第一个代码 sn-p 中,您不需要这样做。列名(第三行)的更正也可以自动完成,例如。使用 readLine
猜你喜欢
  • 1970-01-01
  • 2014-03-26
  • 2013-02-13
  • 2019-12-06
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多