Skip to content

[R-es] Calcular vector, por filas, que cumpla una condición

5 messages · jmcontreras, Jorge I Velez, Javier Marcuzzi +1 more

#
Hola a todos

Quería preguntaros por una forma de hacer esto?


Supongamos que tengo un data Frame parecido a esto:


df <- data.frame(c(12,50,75,100,135), c("Entra", "Sale", "Entra", "Sale", "Entra"))
names(df) <- c("n", "estado?)

    n estado
1  12  Entra
2  50   Sale
3  75  Entra
4 100   Sale
5 135  Entra

Donde n como máximo puede ser 150, por ejemplo.

Necesitaría extraer  un vector con los índices donde  el estado es = a ?Entra?, hasta que ?Sale?.

Es decir, necesitaría que el vector resultante sea c(12:49, 75:99, 135:150).

Gracias de antemano

Saludos
#
Estimado

Busque en internet data.frame seleccionar por condición, dee haber más de 10 formas distintas.Todas válidas, y si hay tantas debe ser porque cada una tiene una aparente ventaja o gusto personal sobre la otra.

Df[df$columna == ´quiero´,]


Javier Rubén Marcuzzi
#
Jose Miguel,
La función rle puede ayudarte a hacer lo que quieres.
Saludos,
Jorge.-

El El vie, 8 de jul. de 2022 a la(s) 7:25 a. m., Jose Miguel Contreras <
jmcontreras en ugr.es> escribió:
#
Estimados

Claro, hay dos formas para la palabra índice, o yo pienso eso ¿cuál es la correcta?

En la pregunta yo interpreto índice como el lugar o fila donde se alojan los datos, supongamos la ubicación i,j como fila y columna, pero índice también es interpretado como cantidad o valoración. El mi primer interpretación, el resultado de la consulta del índice o fila de un data.frame es un vector.

Ustedes que son Españoles y deben manejar el idioma mucho mejor que yo, aparte de tener una formación más adecuada.

¿Está bien lo que yo pienso o estoy equivocado? 

Javier Rubén Marcuzzi

  
  
#
Hola, José Miguel:

Yo lo pasaría a formato "ancho" (dos columnas con "Entra" y "Sale") y 
las uniría.

library(tidyverse)
df <- data.frame(n = c(12, 50, 75, 100, 135), estado = c("Entra", 
"Sale", "Entra", "Sale", "Entra"))
df |>
   add_case(n = 150, estado = "Sale") |>
   mutate(id = cumsum(ifelse(estado == "Entra", 1, 0))) |>
   pivot_wider(names_from = "estado", values_from = "n") |>
   mutate(dif = paste0(Entra, ":", Sale - 1))

Ya de ahí generalizas como necesites (cambiando el 150 o dejando solo el 
vector, p. ej.).

Un saludo,
Álvaro
On 7/8/22 14:25, Jose Miguel Contreras wrote: