Добавить столбец условно - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь добавить новый столбец, значения которого являются условными для других столбцов.

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

Где неправильное условие?

1 Ответ

0 голосов
/ 01 мая 2018

Вот как вы можете это сделать (я использую rand из базы для генерации данных, как этого достаточно в этом случае):

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
...