带有数据帧的条件语句[Julia v1.0]

带有数据帧的条件语句[Julia v1.0],julia,Julia,我正在从R移植自定义函数。我想使用Julia Dataframes来存储我的数据。我喜欢按列名引用,而不是数组索引,因此我使用Dataframes包。 我简化了以下内容以说明: if( DataFrame(x=1).x .>1) end 错误是: 错误:类型错误:在布尔上下文中使用非布尔(位数组{1}) 是否有一个简单的解决方法允许我继续使用数据帧?表达式: DataFrame(x=1).x .> 1 执行以下操作: 创建一个DataFrame 从中提取列x 使用向量化操作将此列

我正在从R移植自定义函数。我想使用Julia Dataframes来存储我的数据。我喜欢按列名引用,而不是数组索引,因此我使用Dataframes包。 我简化了以下内容以说明:

if( DataFrame(x=1).x .>1) end
错误是:

错误:类型错误:在布尔上下文中使用非布尔(位数组{1})

是否有一个简单的解决方法允许我继续使用数据帧?

表达式:

DataFrame(x=1).x .> 1
执行以下操作:

  • 创建一个
    DataFrame
  • 从中提取列
    x
  • 使用向量化操作将此列的所有元素与
    1
    进行比较
  • 实际上,您将获得以下单元素数组:

    julia> DataFrame(x=1).x .> 1
    1-element BitArray{1}:
     false
    
    与R相反,Julia区分向量和标量,因此它与简单地编写
    false
    不同。此外,
    if
    语句期望的是标量而不是向量,因此类似的方法可以工作:

    if 2 > 1
        println("2 is greater than 1")
    end
    
    但不是这样的:

    if DataFrame(x=2).x .> 1
        println("success!")
    end
    
    > if (c(T,F)) {
    + print("aaa") } else {print("bbb")}
    [1] "aaa"
    Warning message:
    In
      the condition has length > 1 and only the first element will be used
    
    但是,例如,这将起作用:

    if (DataFrame(x=2).x .> 1)[1]
        println("success!")
    end
    
    当您从数组中提取第一个(并且仅在本例中)元素时

    请注意,在
    R
    中,如果将多个元素向量传递给条件表达式,则会得到如下警告:

    if DataFrame(x=2).x .> 1
        println("success!")
    end
    
    > if (c(T,F)) {
    + print("aaa") } else {print("bbb")}
    [1] "aaa"
    Warning message:
    In
      the condition has length > 1 and only the first element will be used
    
    在本例中,Julia在检查类型方面比R更严格。在R中,标量和向量之间没有区别,但在Julia中有区别

    编辑:

    length(df)
    返回数据帧的列数(不是行数)。如果您来自
    R
    ,则更容易记住
    nrow
    ncol
    函数

    现在,关于你的问题,你可以写:

    for i in 1:nrow(df)
        if df.x[i] > 3
            df.y[i] = df.x[i] + 1
        end
    end
    

    或者使用
    DataFramesMeta
    缩短符号:

    using DataFramesMeta
    
    @with df begin
        df.y .= ifelse.(:x .> 3, :x .+ 1, :y)
    end
    


    谢谢,这是一个非常清楚的答案。我可以想象,在很多方面,我自学的R技能让我变得相当马虎。在一个有多个元素的列的例子中,应该将if语句嵌套在for循环中吗?e、 g.
    df=DataFrame(x=[2,4],y=[0,0])
    如果(df.x.>3)[i]df.y[i]=df.x[i]+1 end
    或者,是否有更可取的方法?我已经向您介绍了一些可以使用的选项。你可以考虑复习我在数据DATAFRAMS <代码>上的教程,让我们大致了解它们是如何被使用的。这些选项让我准确地知道了我的方向。再次感谢你。我将详细介绍您的教程。只需注意
    ifelse
    示例中
    =
    之前的
    ——这使整个表达式能够正常工作,而不是分配新向量,本质上与循环相同。使用
    bigx
    的示例效率最低,因为它分配了新内存,如果您有一个非常大的
    DataFrame
    ,这将是相关的。
    using DataFramesMeta
    
    @byrow! df begin
        if :x > 3
            :y = :x + 1
        end
    end