Transformar los valores hash basados en una condición después de usar group_by.
Tengo una matriz de pipes
que tienen los siguientes atributos: pipe_id
, grade
y grade_confidence
.
Estoy buscando encontrar objetos dentro de una matriz que tengan los mismos atributos que otros objetos con el mismo ID. He estado utilizando groupby y transformvalues para encontrar los IDs que tienen solo una calificación – eso funciona bien (gracias a las respuestas en https://stackoverflow.com/questions/69408475/using-group-by-for-only-certain-attributes). Sin embargo, me gustaría mantener el grade_confidence en el resultado final si es posible.
class Pipes
attr<em>accessor :pipe</em>id, :grade, :grade<em>confidence
def initialize(pipe</em>id, grade, grade<em>confidence)
@pipe</em>id = pipe<em>id
@grade = grade
@grade</em>confidence = grade_confidence
end
end
pipe1 = Pipes.new("10001", "60", "A")
pipe2 = Pipes.new("10001", "60", "A")
pipe3 = Pipes.new("10001", "3", "F")
pipe4 = Pipes.new("1005", "15", "A")
pipe5 = Pipes.new("1004", "40", "A")
pipe6 = Pipes.new("1004", "40", "B")
pipes = []
pipes.push(pipe1, pipe2, pipe3, pipe4, pipe5, pipe6)
Ahora tenemos nuestra matriz de objetos pipe.
non<em>dups = pipes.group</em>by(&:pipe<em>id).transform</em>values { |a| a.map(&:grade).uniq }.select { |k,v| v.size == 1 }
puts non_dups
=> {“1005″=>[“15”], “1004”=>[“40”]}
Deseado
Lo anterior hace lo que quiero: como “10001” tiene dos grade
diferentes, se ignora, y “1004” y “1005” tienen las mismas calificaciones por ID. Pero lo que me gustaría es mantener el grade_confidence
también, o incluir grade_confidence
en función de una condición también.
Por ejemplo, si grade_confidence
es == "B"
, el resultado final sería # => {"1004"=>["40", "B"]}
o
Si grade_confidence
es == "A"
, el resultado final sería # => {"1005"=>["15", "A"], "1004"=>["40", "A"]}
¿Es posible ajustar el transform_values para permitir esto o necesitaría usar otra opción?
Gracias
davy.ai
Para lograr el resultado deseado, podemos modificar el bloque
transform_values
para crear un arreglo que contenga tanto los valoresgrade
comograde_confidence
, y luego usar condiciones adicionales para filtrar el resultado basado en los valores deseados degrade_confidence
.Aquí está el código actualizado:
En esta versión, creamos un arreglo de pares de
grade
ygrade_confidence
para cadapipe_id
, usamosuniq
para eliminar duplicados y filtramos cualquier par que no tenga los valores deseados degrade_confidence
. Luego, mapeamos los pares restantes a un arreglo que incluye tantograde
comograde_confidence
, o solograde
sigrade_confidence
es nulo. Finalmente, aplanamos los arreglos resultantes para obtener un único arreglo degrades
ygrade_confidences
.También utilizamos el método
select
para filtrar cualquier entrada depipe_id
que tenga menos de dos valores en el arreglo resultante (ya que no tendrían duplicados).Esto debería dar el resultado deseado de devolver un arreglo de
pipe_ids
y sus respectivosgrades
ygrade_confidences
, filtrados por un valor especificado degrade_confidence
.