2017-10-18 114 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

相關問題