• R语言
  • 【求助】read.csv使用colClasses在沒有column name的欄位時會出錯

你看你看,我是不是几天前刚说过,文字的内容不要截图发出来:https://d.cosx.org/d/421820/4 这种截图的恶习对回答问题来说是大大的不方便,别人无法运行你的代码。CSV 数据、错误消息,这都是文本,复制粘贴即可(CSV 数据用文本编辑器打开即可看到文本内容,不要用 Excel)。

    yihui 抱歉 我沒有想到CSV 数据、错误消息也是文本,已經修改好了

    tctcab

    了解,奇怪的是我把名稱補回去源数据後,還是得到一樣的錯誤

    Time,Mkt_RF,SMB,HML,RF
    192607,2.96,-2.3,-2.87,0.22
    192608,2.64,-1.4,4.19,0.25
    192609,0.36,-1.32,0.01,0.23
    192610,-3.24,0.04,0.51,0.32
    192611,2.53,-0.2,-0.35,0.31
    data <-
      read.csv(
        "C:/Users/Yoga/Desktop/F-F_Research_Data_Factors.csv",
        header = T,
        colClasses = c("character", rep("numeric", 4))
      )
    Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : scan() 需要 'a real',而不是 'Mkt-RF'

    好崩潰阿,這到底是怎麼回事

      rockon8765 不要用 header = T;换用 header = TRUE 试试。

      在我这里,你的代码没出错。但是如果把你的代码改成 header = FALSE,就出现同样的错误信息:

      read.csv("test.csv", header = FALSE, colClasses = c("character", rep("numeric", 4)))
      ## Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :   scan() expected 'a real', got 'Mkt_RF'

      所以我怀疑你的对象 T 是不是在前面被赋值为 0 了。

        rockon8765
        你提到的这个问题不可重复,下边是我用你的数据和代码运行的结果:

        test <- read.csv("/home/liechi/Desktop/testdata.csv", header = T,  colClasses = c("character", rep("numeric", 4)))
        test
        #>     Time Mkt_RF   SMB   HML   RF
        #> 1 192607   2.96 -2.30 -2.87 0.22
        #> 2 192608   2.64 -1.40  4.19 0.25
        #> 3 192609   0.36 -1.32  0.01 0.23
        #> 4 192610  -3.24  0.04  0.51 0.32
        #> 5 192611   2.53 -0.20 -0.35 0.31
        str(test)
        #> 'data.frame':    5 obs. of  5 variables:
        #>  $ Time  : chr  "192607" "192608" "192609" "192610" ...
        #>  $ Mkt_RF: num  2.96 2.64 0.36 -3.24 2.53
        #>  $ SMB   : num  -2.3 -1.4 -1.32 0.04 -0.2
        #>  $ HML   : num  -2.87 4.19 0.01 0.51 -0.35
        #>  $ RF    : num  0.22 0.25 0.23 0.32 0.31

          dapengde
          之前听别人建议不要在写判断时用 T 和 F,最好写全,我一直不明白为什么,但你提到的这个可能情况让我有点明白了---虽然我觉得把变量命名为 T 应该不常发生。

          dapengde
          換用header = TRUE後也是一樣的結果。
          程式剛開始寫,還沒賦值,只有一些rmarddown的設定而已

          R version 4.0.2 (2020-06-22)
          Platform: x86_64-apple-darwin17.0 (64-bit)
          Running under: macOS Catalina 10.15.7
          
          Matrix products: default
          BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
          LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
          
          locale:
          [1] zh_TW.UTF-8/zh_TW.UTF-8/zh_TW.UTF-8/C/zh_TW.UTF-8/zh_TW.UTF-8
          
          attached base packages:
          [1] stats     graphics  grDevices utils     datasets  methods   base     
          
          loaded via a namespace (and not attached):
          [1] compiler_4.0.2 tools_4.0.2  

          Liechi 恭喜你,難道是我電腦問題嗎

          R version 4.0.2 (2020-06-22)
          Platform: x86_64-apple-darwin17.0 (64-bit)
          Running under: macOS Catalina 10.15.7
          
          Matrix products: default
          BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
          LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
          
          locale:
          [1] zh_TW.UTF-8/zh_TW.UTF-8/zh_TW.UTF-8/C/zh_TW.UTF-8/zh_TW.UTF-8
          
          attached base packages:
          [1] stats     graphics  grDevices utils     datasets  methods   base     
          
          loaded via a namespace (and not attached):
          [1] compiler_4.0.2 tools_4.0.2 

            rockon8765
            我换成和你一样的电脑 和 R 版本,也可以顺利运行你的代码。

            test <- read.csv("/Users/behlab-liechi/Downloads/test.txt", header = T,  colClasses = c("character", rep("numeric", 4)))
            test
            #>     Time Mkt_RF   SMB   HML   RF
            #> 1 192607   2.96 -2.30 -2.87 0.22
            #> 2 192608   2.64 -1.40  4.19 0.25
            #> 3 192609   0.36 -1.32  0.01 0.23
            #> 4 192610  -3.24  0.04  0.51 0.32
            #> 5 192611   2.53 -0.20 -0.35 0.31
            str(test)
            #> 'data.frame':    5 obs. of  5 variables:
            #>  $ Time  : chr  "192607" "192608" "192609" "192610" ...
            #>  $ Mkt_RF: num  2.96 2.64 0.36 -3.24 2.53
            #>  $ SMB   : num  -2.3 -1.4 -1.32 0.04 -0.2
            #>  $ HML   : num  -2.87 4.19 0.01 0.51 -0.35
            #>  $ RF    : num  0.22 0.25 0.23 0.32 0.31
            sessionInfo()
            #> R version 4.0.2 (2020-06-22)
            #> Platform: x86_64-apple-darwin17.0 (64-bit)
            #> Running under: macOS Catalina 10.15.7
            #> 
            #> Matrix products: default
            #> BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
            #> LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
            #> 
            #> locale:
            #> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
            #> 
            #> attached base packages:
            #> [1] stats     graphics  grDevices utils     datasets  methods   base     
            #> 
            #> loaded via a namespace (and not attached):
            #>  [1] compiler_4.0.2  magrittr_1.5    tools_4.0.2     htmltools_0.5.0
            #>  [5] yaml_2.2.1      stringi_1.5.3   rmarkdown_2.4   highr_0.8      
            #>  [9] knitr_1.30      stringr_1.4.0   xfun_0.18       digest_0.6.26  
            #> [13] rlang_0.4.8     evaluate_0.14

            <sup>Created on 2020-10-23 by the reprex package (v0.3.0)</sup>

            rockon8765
            你的列名里有一个 Mkt_RF,但是报错信息是说在应该出现数字的地方,出现了 Mkt-RF。列名里出现的是下划线 _,而报错里出现的是连接符 -。我想,你没有贴全所有数据,在你的数据的某处可能出现了 Mkt-RF

              说到底,这又是一个 minimal reproducible example 的问题。

              刚开始的“因為發現直接讀取會全部都變成文字”其实已经是一条线索了。后面的headercolClasses其实是走岔了路。如果刚开始就提供一个能重现问题的数据框,后面的一切都不必发生。

              rockon8765
              可重复示例的意思是同样的数据,同样的代码,在你自己的电脑上能稳定复现问题的例子。你可能是觉得原数据太多,所以为方便起见只取其中一部分做演示,这完全是合理的。但这样的话,最好把这部分数据和代码在自己的电脑上运行一次,确认它是可重复的,然后再和大家讨论。如果你发现这取出来的部分运行不会报错,可能自己就能顺着追踪下去发现问题所在了。

              对初学者来说,连问问题都会遇到防不胜防的坑,这很正常。这个论坛是养成型的:)你可以心安理得的踩坑,只要别重复踩新手须知里已经列出来的坑和别人在讨论中已经指出的坑就好。

                Liechi 對 因為原數據太多所以才只擷取一段 下次會注意 感謝大家的包容