【问题标题】:Column name containing a space in Plots.jlPlots.jl 中包含空格的列名
【发布时间】:2019-03-17 01:54:14
【问题描述】:

我正在尝试在 Julia Plots.jl(GR 后端)中绘制名称包含空格的数据框的特定列。

这是我的数据框结构:

17-element Array{Symbol,1}:
 Symbol("DATE/TIME")      
 [...]                
 :TEMPERATURE             
 Symbol("EXT TEMPERATURE")
 :PIM                     
 [...]

这是我的代码:

using CSV, DataFrames
me=CSV.File(joinpath(dir,"myfile.csv"),delim=';')
medf=me|>DataFrame
using Plots,StatPlots,GR
@df medf GR.plot(Symbol("EXT TEMPERATURE"),title="Temperature")

这失败了:

MethodError: no method matching plot(::Symbol)
Closest candidates are:
  plot(!Matched::Union{AbstractString, Function, AbstractArray{T,2} where T, AbstractArray{T,1} where T}...; kv...) at C:\Users\condo\.julia\packages\GR\joQgG\src\jlgr.jl:1118

我可以:

@df medf GR.plot(:TEMPERATURE)

但我不能:

@df medf GR.plot(:EXT TEMPERATURE)

在这种特殊情况下,我应该如何引用本专栏?

【问题讨论】:

  • 你能用名字重命名列吗!还是您需要列名来保留该空间?
  • 我希望保留原来的列名。
  • 你的问题正是为什么 R 版本的 DataFrame 有 check.names-TRUE 选项,它会自动将列标签更改为有效名称。
  • CSV.File 有一个 normalizenames 选项。

标签: csv dataframe julia plots.jl


【解决方案1】:

我刚刚在导入扩展名为 .sav 的 SPSS 文件时遇到了这个问题。也可以通过执行以下操作来引用名称中带有空格的符号:

Symbol("SOME NAME WITH SPACE")

我注意到您在您的某些代码中已经这样做了,但并非在您使用带空格的名称的所有地方都这样做。您也应该能够在后续调用中做到这一点。例如,您可以:

@df medf GR.plot(Symbol("EXT TEMPERATURE"))

在我的情况下,我的 SPSS 文件中有很多列,名称中有空格,因此我编写了一个宏来为我执行此操作:

macro s_str(s)
  Expr(:quote, Symbol(s))
end

那么后续调用可以这样进行:

@df medf GR.plot(s"EXT TEMPERATURE")

我在 DataFrames 上使用这个效果很好,在其他包上使用 YMMV。

【讨论】:

    【解决方案2】:

    StatPlots 中的宏 @df 似乎有一些限制。幸运的是,StatPlots 包提供了cols() 作为针对您的情况的解决方法。

    试试:

    using CSV, DataFrames
    me=CSV.File(joinpath(dir,"myfile.csv"),delim=';')
    medf=me|>DataFrame
    using StatPlots
    gr()  # N.B.: You can include things like size=(400,300), or dpi=400 here as params
    @df medf plot(cols(Symbol("EXT TEMPERATURE")),title="Temperature")
    

    【讨论】:

      【解决方案3】:

      Julia 倾向于将 Symbol 常量 :symb 视为在某些上下文中的变量名,因此如果您尝试使用包含空格的 Symbols 就好像它们是变量名一样会变得很尴尬,因为 Julia 中的变量名不能包含空格。

      但是,您也可以通过这种方式通过位置来引用 DataFrame 列:

      using CSV, DataFrames, Plots
      iob = IOBuffer("""DATE/TIME,EXT TEMPERATURE\n2018-10-10 12:30, 22.4\n2018-10-11 08:10,26.1\n""")
      df = convert(DataFrame, CSV.read(iob))
      plot(df[2], ylabel=names(df)[2]) 
      

      【讨论】:

      • 很好,但我更喜欢按名称引用列,因为我熟悉 CSV 文件的结构。
      猜你喜欢
      • 2021-01-17
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2017-11-30
      • 2014-07-05
      相关资源
      最近更新 更多