2017-10-18 110 views
0

我有一个csv,我想作为data.frame导入到R中。这csv有我不能改变的标题,如USD.ZeroCouponBondPrice(1m)USD-EQ-SP500。当我尝试将其导入到R,然而,R的read.csv函数覆盖字符()-.虽然我没能找到一种方法在功能documentation来解决这个问题,这行代码的工作:R read.csv错误地导入列名称

colnames(df)<-c('USD.ZeroCouponBondPrice(1m)', 'USD-EQ-SP500') 

这些字符在data.frame列名中是合法的。覆盖所有的列名是烦人的和脆弱的,因为它们有超过20个,并且它们改变是不可想象的。有没有办法阻止read.csv替换这些字符,或者使用替代函数?

+0

我不知道你能怎么样,但有可能使使用'Tibbles'一些黑客。通过'Tibbles',你可以使用_crazy name_(https://cran.r-project.org/web/packages/tibble/vignettes/tibble.html)获取变量名称。 –

回答

3

如果设置参数

check.names = FALSE 
在read.csv

,则R将不会覆盖名称。但是这些名称在R中无效,它们必须与有效名称不同处理。

+0

“处理不同”的一个例子是,如果您使用'$'表示法引用变量,则需要在变量名称周围加上反引号。 'DF $ \'USD.ZeroCouponBondPrice(1M)\''。 –

-2

举例说明如何使用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 

请务必仔细阅读this introduction to Tibbles因为它们的行为与常规数据帧略有不同的可能Tibbles解决方案利用Kelli-Jean's answer

万一有人需要使用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)) 
+0

由于'read.csv(dta,check.names = FALSE)'显示的结果,您可以在本机数据框中为变量使用无效名称。我用tibbles看到的唯一区别是它不会在使用'tibble()'函数创建一个名称时自动转换名称。至于OP的问题,至少在read.csv()'周围我没有看到''as_tibble()''的附加好处。 –

+0

@BrianStamper我很感谢您的反馈。 –

+1

我接受@ Kelli-Jean的答案,因为它更容易实现为解决方案,但我发现这个答案作为一个合理的选择是有帮助的。我没有详细说明我想要一个只使用R的基本包的答案,所以我不认为这个答案值得反对(不确定它是否是你)。 – Theaetetos

相关问题