Julia 有条件地添加列

Julia 有条件地添加列,julia,Julia,我试图添加一个新列,其值以其他列为条件 using DataFrames, DataFramesMeta df = DataFrame(a = 1:10, b = StatsBase.sample([0, 1], 10, replace = true), c = StatsBase.sample([0, 1], 10, replace = true), d = StatsBase.sample([0

我试图添加一个新列,其值以其他列为条件

using DataFrames, DataFramesMeta

df = DataFrame(a = 1:10, 
               b = StatsBase.sample([0, 1], 10, replace = true), 
               c = StatsBase.sample([0, 1], 10, replace = true), 
               d = StatsBase.sample([0, 1], 10, replace = true))
@linq df |>
    transform(e = ifelse.(:b == 1 || :c == 1 || :d == 1, 1, 0))
但这并不能正确评估:

    a   b   c   d   e
1   1   0   1   1   0
2   2   1   0   1   0
3   3   0   0   0   0
4   4   1   1   0   0
5   5   1   0   0   0
6   6   0   1   0   0
7   7   0   0   0   0
8   8   1   0   1   0
9   9   1   0   1   0
10  10  0   1   1   0
哪里出了问题

以下是您如何做到这一点(我使用
rand
from Base生成数据,因为在这种情况下就足够了):

问题是,您必须将
转换
中的操作广播为
:b==1
等。这些操作将始终为

我还展示了在这种情况下,您可以使用
Int
简单地将结果转换为整数,
ifelse
非常有用,如果您需要一些常规值

实际上在这种情况下,可能是byrow更简单:

@byrow! df begin
    @newcol e::Vector{Int}
    :e = :b == 1 || :c == 1 || :d == 1 ? 1 : 0
end

可能不是一个优雅但简单的解决方案:

df[df.a .< 5, :b] .= 2
df[df.a.<5,:b].=2

太棒了@拜罗!在这种情况下,这是一个相当优雅的解决方案。你应该成为每个Julia数据科学新手的必读读物。。。
df[df.a .< 5, :b] .= 2