R读取csv文件时,列名导入不正确。

9
我有一个csv文件,想将其作为数据框导入R。这个csv文件的标题是像USD.ZeroCouponBondPrice(1m)USD-EQ-SP500这样的内容,我无法更改。但是当我尝试在R中导入它时,R的read.csv函数会将字符()-覆盖为.。虽然我没有找到在文档中修复此问题的方法,但这行代码有效:
colnames(df)<-c('USD.ZeroCouponBondPrice(1m)', 'USD-EQ-SP500')

因此,这些字符在 data.frame 的列名中是合法的。覆盖所有的列名是很麻烦和脆弱的,因为有超过20个列名,它们可能会改变。有没有一种方法可以防止 read.csv 替换这些字符,或者使用替代函数?


我不确定如何做到,但可能你可以使用 Tibbles 进行一些黑客技巧。使用 Tibbles,您可以为变量的名称使用 疯狂的名称 - Eric Fail
2个回答

17
如果您设置了参数。
check.names = FALSE

如果在read.csv函数中指定了列名,R将不会覆盖这些列名。但是这些列名在R中是无效的,因此它们需要与有效名称不同地处理。


1
“处理方式不同”的一个例子是,如果您使用$符号引用变量,则需要在变量名称周围加上反引号,例如df$\USD.ZeroCouponBondPrice(1m)``。 - Brian Stamper

-2

演示一个可能的Tibbles解决方案,利用Kelli-Jean的答案来说明如何使用check.names = FALSE

# install.packages(c("tidyverse"), dependencies = TRUE)
library(tibble)
dta <- url("http://s3.amazonaws.com/csvpastebin/uploads/a4c665743904ea8f18dd1f31edcbae04/crazy_names.csv")
TBdta <- as_tibble(read.csv(dta, check.names = FALSE)) 
TBdta
#> # A tibble: 6 x 3
#>   USD.ZeroCouponBondPrice(1m) USD-EQ-SP500 crazy name
#>                        <fctr>        <dbl>      <int>
#> 1                           A         10.0         12
#> 2                           A         11.0         14
#> 3                           B          5.0          8
#> 4                           B          6.0         10
#> 5                           A         10.5         13
#> 6                           B          7.0         11

请务必阅读这篇介绍Tibbles的文章,因为它们与普通数据框的行为有所不同。

如果有人需要使用https

temporaryFile <- tempfile()
download.file("https://s3.amazonaws.com/csvpastebin/uploads/a4c665743904ea8f18dd1f31edcbae04/crazy_names.csv", destfile = temporaryFile, method="curl")
TBdta2 <- as_tibble(read.csv(temporaryFile, check.names = F)) 

在本地数据框中,您可以使用无效的变量名称,如 read.csv(dta, check.names = FALSE) 的结果所示。我唯一看到的与tibbles的区别是,当您使用tibble()函数创建一个Tibble时,它不会自动转换名称。至少就OP的问题而言,我没有看到将as_tibble()包装在read.csv()周围有任何额外的好处。 - Brian Stamper
@BrianStamper 我感谢您的反馈。 - Eric Fail
1
我接受了@Kelli-Jean的答案,因为它更容易实现作为解决方案,但我发现这个答案是一个合法的替代方案,也很有帮助。我没有明确说明我想要一个只使用R基本包的答案,所以我不认为这个答案应该被点踩(不确定是否是你)。 - Theaetetos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接