R:用read.csv()尊重数字(作为字符处理)的引号?

时间:2014-04-07 21:48:16

标签: r csv formatting

我有一个.csv文件,其帐户代码的格式为00xxxxx,我需要它们保留这种方式,以便与使用此格式的帐户代码的其他程序一起使用。我正在制作一个R脚本来协调周五的帐户费用以及{{1>}正在为我工​​作的 swore 。现在,它似乎不是。这是一些示例数据:

as.is = T

我的test <- data.frame(col1 = c("apple", "banana", "carrot"), col2 = c(100, 200, 300), col3 = c("00234", "00345", "00456")) 策略:

write.table

删除旧write.table(test, file = "C:/path/test.csv", quote = T, sep=",", row.names = F) 并重新阅读:

data.frame

如果不清楚,它应该看起来像我们创建的原始rm(test) test <- read.csv("C:/path/test.csv") test col1 col2 col3 1 apple 100 234 2 banana 200 345 3 carrot 300 456

data.frame

在仔细阅读可用的test col1 col2 col3 1 apple 100 00234 2 banana 200 00345 3 carrot 300 00456 选项后,我还尝试了以下结果,其结果与上述相同:

read.table
在这种情况下,

test <- read.csv("C:/path/test.csv", quote = '"') test <- read.csv("C:/path/test.csv", as.is = T) test <- read.csv("C:/path/test.csv", as.is = T, quote = '"') 似乎并不相关(听起来StringsAsFactors会做同样的事情。

当我在Emacs中打开文件时,as.is确实被引号括起来,所以我希望它被视为文本而不是转换为数字:

emacs screenshot

其他大多数问题只是关于不处理因素之类的事情,或者将数字而不是识别为字符,通常是该列中忽略的字符串的结果。

我看到我可以从this one这样的问题中追求col3论证,但我不愿意这样做;我的“colClasses”内置于数据中:) Quoted = character,not quoted = numeric。

3 个答案:

答案 0 :(得分:2)

我希望有更好的方法,但有一种方法是使用quote=""

test <- read.csv("C:/path/test.csv", as.is = TRUE, quote = "") 

这会使引号成为值的一部分,为您提供:

test
#col1 col2  col3
#1  apple  100 "00234"
#2 banana  200 "00345"
#3 carrot  300 "00456"

然后您可以将它们保留为该格式,或使用类似gsub的内容删除它们:

test$col3 <- gsub('"', '', test$col3)

test
#col1 col2  col3
#1  apple  100 00234
#2 banana  200 00345
#3 carrot  300 00456

你可以使用某种apply-type函数一次在整个数据框上执行gsub:

test <- as.data.frame(sapply(test,gsub,pattern='"',replacement=""))

来自R - how to replace parts of variable strings within data frame

的代码

显然,如果您因其他原因不需要引号,此方法对您有用。

答案 1 :(得分:2)

在对几个R用户的朋友进行ping操作后,他们都建议使用colClasses。我松了一口气,发现我不需要指定每个类,因为我的数据是~25列。所以证实了这一点(一旦我知道我在寻找什么)in another question

test <- read.csv("C:/path/test.csv", colClasses = c(col3 = "character"))
test

    col1 col2  col3
1  apple  100 00234
2 banana  200 00345
3 carrot  300 00456

目前的情况是,问题是另一方面与解决方案的重复。区别在于我正在寻找其他而不是colClasses的方式(因为as.is听起来像是一个可能的候选人),而那个问题是关于如何使用colClasses

我会重申,我实际上并不喜欢这个解决方案,甚至认为这很简单。引号表示.csv中的文本字段,在这种情况下它们似乎不受尊重。 LibreOffice .csv导入有一个“处理引用字段为文本”的复选框,我认为这类似于R中的as.is = T。显然不是! #end_rant

答案 2 :(得分:2)

我也有这个问题。当然,您可以手动指定colClasses,但为什么在引用数据时这是必要的?我同意OP在他自己的问题中回答的“咆哮”:

  

引号表示.csv中的文本字段,它们似乎不是   在这种情况下受到尊重。

无论如何,我选择使用没有此问题的data.table fread()。尽管read.csv仍然令人讨厌。

# here's a data frame with chr and int columns
my_df <- data.frame(chars=letters[1:5],
                    nums=1:5,
                    txt_nums=sprintf('%02d', 1:5),
                    stringsAsFactors=F)

# all looks as it should
lapply(my_df, class)

# $chars
# [1] "character"
# 
# $nums
# [1] "integer"
# 
# $txt_nums
# [1] "character"

但是现在,写信给csv,读回来,第三列被强制转换为int!

# quote=T redundant since that's the default, but just to be sure
write.csv(my_df, 'my_df.csv', row.names=F, quote=T) 
my_df2 <- read.csv('my_df.csv')
lapply(my_df2, class)

# even with as.is=TRUE, same issue
my_df2 <- read.csv('my_df.csv', as.is=T)
lapply(my_df2, class)

# data.table's fread doesn't have this issue, at least
library(data.table)
my_dt <- fread('my_df.csv')
lapply(my_dt, class)