带有数据帧的条件语句[Julia v1.0]
我正在从R移植自定义函数。我想使用Julia Dataframes来存储我的数据。我喜欢按列名引用,而不是数组索引,因此我使用Dataframes包。 我简化了以下内容以说明:带有数据帧的条件语句[Julia v1.0],julia,Julia,我正在从R移植自定义函数。我想使用Julia Dataframes来存储我的数据。我喜欢按列名引用,而不是数组索引,因此我使用Dataframes包。 我简化了以下内容以说明: if( DataFrame(x=1).x .>1) end 错误是: 错误:类型错误:在布尔上下文中使用非布尔(位数组{1}) 是否有一个简单的解决方法允许我继续使用数据帧?表达式: DataFrame(x=1).x .> 1 执行以下操作: 创建一个DataFrame 从中提取列x 使用向量化操作将此列
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
或者,是否有更可取的方法?我已经向您介绍了一些可以使用的选项。你可以考虑复习我在ifelse
示例中=
之前的
——这使整个表达式能够正常工作,而不是分配新向量,本质上与循环相同。使用bigx
的示例效率最低,因为它分配了新内存,如果您有一个非常大的DataFrame
,这将是相关的。
using DataFramesMeta
@byrow! df begin
if :x > 3
:y = :x + 1
end
end