我正在尝试添加一个新列,其值以其他列为条件。
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
条件错在哪里?
答案 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