Как я могу создать новую переменную в Julia, используя фрейм данных условия ifelse?

#dataframe #julia

Вопрос:

Я хочу создать новую переменную (nota), используя функцию if-else с transform! функцией из DataFrames пакета.

Вот мой код:

 using DataFrames datos = DataFrame(nombre =["ANGELICA","BRENDA","LILIANA","MARCO","FABIAN","MAURICIO"],  grupo = ["A","A","B","B","C","C"],  puntaje = [10,9,8,8,9,7]); transform!(datos, :puntaje =gt; ifelse(datos[datos.puntaje .lt; 9,:],"Suficiente","Excelente") =gt; :nota)  

но эта ошибка отображается:

 ERROR: TypeError: non-boolean (BitVector) used in boolean context  Stacktrace:  [1] top-level scope   @ REPL[23]:1  

Как я могу это решить?

Ответ №1:

Две проблемы:

  1. Вы смешиваетесь ByRow с обычным преобразованием, которое выполняется по столбцам
  2. Вы не можете изменить тип puntaje столбца

Вы, наверное, хотите это сделать:

 juliagt; datos.puntaje = ifelse.(datos.puntaje .lt; 9, "Suficiente", "Excelente") 6-element Vector{String}:  "Excelente"  "Excelente"  "Suficiente"  "Suficiente"  "Excelente"  "Suficiente"  juliagt; datos 6×3 DataFrame  Row │ nombre grupo puntaje   │ String String String  ─────┼──────────────────────────────  1 │ ANGELICA A Excelente  2 │ BRENDA A Excelente  3 │ LILIANA B Suficiente  4 │ MARCO B Suficiente  5 │ FABIAN C Excelente  6 │ MAURICIO C Suficiente  

Комментарии:

1. Спасибо за вашу помощь. На самом деле, я хочу создать новую переменную datos.nota = ifelse.(datos.puntaje .lt; 9, "Suficiente", "Excelente")

Ответ №2:

Если вы предпочитаете использовать transform! два синтаксиса , которые работают:

 juliagt; datos = DataFrame(nombre =["ANGELICA","BRENDA","LILIANA","MARCO","FABIAN","MAURICIO"],  grupo = ["A","A","B","B","C","C"],  puntaje = [10,9,8,8,9,7]);  juliagt; transform!(datos, :puntaje =gt; (p -gt; ifelse.(p .lt; 9, "Suficiente", "Excelente")) =gt; :nota) 6×4 DataFrame  Row │ nombre grupo puntaje nota   │ String String Int64 String  ─────┼───────────────────────────────────────  1 │ ANGELICA A 10 Excelente  2 │ BRENDA A 9 Excelente  3 │ LILIANA B 8 Suficiente  4 │ MARCO B 8 Suficiente  5 │ FABIAN C 9 Excelente  6 │ MAURICIO C 7 Suficiente  juliagt; transform!(datos, :puntaje =gt; ByRow(p -gt; ifelse(p lt; 9, "Suficiente", "Excelente")) =gt; :nota) 6×4 DataFrame  Row │ nombre grupo puntaje nota   │ String String Int64 String  ─────┼───────────────────────────────────────  1 │ ANGELICA A 10 Excelente  2 │ BRENDA A 9 Excelente  3 │ LILIANA B 8 Suficiente  4 │ MARCO B 8 Suficiente  5 │ FABIAN C 9 Excelente  6 │ MAURICIO C 7 Suficiente