HOWTO · R

Encuentra el número de fila en R

Este tutorial demuestra cómo encontrar un número de fila para un valor en R.

En esta página

Usa which() para encontrar la posición de cada fila que cumple una condición, o match() para encontrar la primera posición de cada valor que buscas. Por ejemplo, which(staff$role == "Senior Dev") devuelve la posición de cada fila coincidente en staff. Si ninguna fila cumple la condición, which() devuelve integer(0). Con match(), una consulta sin coincidencias devuelve NA. La cadena de ejemplo Senior Dev se mantiene en inglés en el código.

Estas posiciones son números de fila cuando la prueba lógica o el vector de búsqueda sigue el orden de las filas del data frame. En los data frames normales de R, las posiciones de fila comienzan en 1. Si necesitas la etiqueta de la fila, compara rownames(data) o búscala con match().

Encontrar números de fila con which()

which() recibe un vector lógico y devuelve las posiciones cuyos valores son TRUE. Una comparación con una columna de un data frame crea ese vector lógico, por lo que las posiciones devueltas identifican las filas en el mismo orden que el data frame. La función devuelve todas las coincidencias, así que resulta adecuada para condiciones que pueden seleccionar varias filas.

Ejecuta este ejemplo:

staff <- data.frame(
  name = c("Ari", "Bea", "Chen", "Devi"),
  role = c("Analyst", "Senior Dev", "Senior Dev", "Manager")
)
which(staff$role == "Senior Dev")

El resultado contiene las posiciones 2 y 3 porque ambas filas tienen ese rol. Para buscar filas mediante una condición numérica o compuesta, cambia la expresión lógica; por ejemplo, which(grades$Math > 80) selecciona todas las filas cuyo valor de Math supera 80. Ten presente el orden de las filas del data frame si después utilizas estas posiciones para seleccionar elementos de otro objeto.

Para buscar por nombres de fila personalizados, compara las etiquetas que devuelve rownames():

people <- data.frame(name = c("Ari", "Bea", "Chen"))
rownames(people) <- c("north", "central", "south")
which(rownames(people) == "central")

Esto devuelve la posición de la fila cuya etiqueta es central; la etiqueta en sí no es el número de fila. Si ya tienes un vector cuyos elementos corresponden uno a uno con las filas, which(values == target) funciona del mismo modo. Para un vector independiente, llama al resultado posición; solo es un número de fila si ese vector representa las filas del data frame.

Si la comparación contiene valores ausentes, which() no devuelve sus posiciones. Si necesitas considerar los valores ausentes como parte de una condición, trátalos explícitamente en la expresión lógica antes de llamar a which().

Encontrar la primera posición de un valor con match()

Usa match(query, table) cuando quieras encontrar la primera posición de un valor en un vector, una columna o un vector de nombres de fila. query puede contener uno o varios valores; el resultado incluye una posición por cada consulta. A diferencia de which(), match() devuelve solo la primera coincidencia de cada consulta. De forma predeterminada, una consulta que no aparece en table produce NA.

Para buscar en una columna de un data frame, coloca primero el valor buscado y después la columna:

staff <- data.frame(
  role = c("Analyst", "Senior Dev", "Senior Dev", "Manager")
)
match("Senior Dev", staff$role)

La posición devuelta es 2, correspondiente a la primera fila coincidente, aunque el valor aparezca de nuevo más adelante. La misma forma sirve para vectores: match(78, grades) encuentra la primera posición de 78. Usa match("central", rownames(people)) para obtener la posición de una etiqueta de fila.

Pasa varios valores buscados en un vector para obtener una posición para cada uno:

grades <- c(88, 90, 75, 94, 80)
match(c(75, 94, 70), grades)

El resultado indica las posiciones de 75 y 94, seguidas de NA para 70. Las posiciones mantienen el orden de las consultas, no el orden de la tabla. Si la tabla contiene duplicados, cada consulta sigue correspondiendo a su primera coincidencia. Cuando una consulta no aparece, comprueba si el resultado es NA antes de usar la posición para seleccionar elementos de otro objeto.

Conclusión

Elige which() cuando una condición pueda coincidir con varias filas y necesites todas las posiciones; si no hay coincidencias, devuelve integer(0). Elige match() cuando quieras buscar uno o varios valores y necesites la primera posición de cada uno; devuelve NA si un valor no aparece. Con cualquiera de las dos funciones, las posiciones corresponden a filas del data frame solo si el vector buscado conserva el mismo orden de filas. Usa rownames() cuando necesites la etiqueta de la fila en lugar de su posición.