有条件地添加列

时间:2018-05-01 10:04:05

标签: 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, 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

条件错在哪里?

2 个答案:

答案 0 :(得分:2)

以下是如何做到这一点(我使用Base的using DataFrames, DataFramesMeta df = DataFrame(a = 1:10, b = rand([0, 1], 10), c = rand([0, 1], 10), d = rand([0, 1], 10)) @linq df |> transform(e = Int.((:b .== 1) .| (:c .== 1) .| (:d .== 1))) @linq df |> transform(e = ifelse.((:b .== 1) .| (:c .== 1) .| (:d .== 1), "yes", "no")) 来生成数据,因为在这种情况下就足够了):

transform

问题是您必须在:b == 1内广播操作,因为false等等将始终为Int

我还表明,在这种情况下,您可以使用ifelse将结果简单地转换为整数,如果您想要一些常规值,则@byrow!非常有用。

实际上在这种情况下,@byrow! df begin @newcol e::Vector{Int} :e = :b == 1 || :c == 1 || :d == 1 ? 1 : 0 end 可能更简单:

This is some text TK-12354 aasdgf asdf 
adsf aasdf TK-122 sadf sfdg   sfdgsdfg
dghgf sfdg sdfg  sdfg sdgf dsf TK-1243

答案 1 :(得分:0)

也许不是一个优雅但简单的解决方案:

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