Guillermo.Vinue en uv.es
2018-Mar-09 15:02 UTC
[R-es] Contar categorías después de ciertos valores
Hola, Estoy intentando averiguar cómo contar el número de categorías situadas después de ciertos valores. Por ejemplo, en el siguiente vector: x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3) el resultado que quisiera obtener es: Valor -> Resultado 3 -> 1 A y 1 B 4 -> 0 A y 0 B 5 -> 3 A y 0 B ¿Alguien tiene alguna sugerencia?. Muchas gracias de antemano. Guillermo
Estimado Guillermo Vinue Es relativamente simple pero se complica. Simple porque puede recorrer todos los elementos del vector y al encontrar un número cortar el vector en esa posición, pero se complica porque en su ejemplo hay dos números 5. Para buscar la posición: puede usar match(c(3,4,5),datos) entre otras posibilidades. Para cortar en la posición encontrada https://www.rdocumentation.org/packages/base/versions/3.4.3/topics/cut Luego de encontrar el número, a partir de este la posición para cortar, hay que organizar un poco para trabajar con varios fragmentos (vectores), pero tenga en cuenta que en su ejemplo no hay un orden, no sería problema, en todos casos tienen varios fragmentos que comienzan con el mismo número. Javier Rubén Marcuzzi El 9 de marzo de 2018, 12:02, <Guillermo.Vinue en uv.es> escribió:> Hola, > > Estoy intentando averiguar cómo contar el número de categorías situadas > después de ciertos valores. Por ejemplo, en el siguiente vector: > > x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3) > > el resultado que quisiera obtener es: > > Valor -> Resultado > 3 -> 1 A y 1 B > 4 -> 0 A y 0 B > 5 -> 3 A y 0 B > > ¿Alguien tiene alguna sugerencia?. > > Muchas gracias de antemano. > > Guillermo > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]
Hola, Esta es una forma... #----------------- x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3) x_n <- as.numeric(x) cat_val <- unique(x[is.na(x_n)]) num_val <- x_n[!is.na(x_n)] df <- data.frame( x_n = x_n, y = 1:length(x_n), x = x, x_l = is.na(df$x_n) ) num_df <- data.frame( nume = 0, letra = 0) cont <- 0 for(i in 1:nrow(df)) { if (df[i, 4] == FALSE & df[i + 1, 4] != FALSE & i < nrow(df)) { num <- df[i, 1] } if (df[i, 4] != FALSE) { cont <- cont + 1 num_df[cont, 1] <- num num_df[cont, 2] <- as.vector(df[i, 3]) } if (df[i, 4] == FALSE & df[i + 1, 4] == FALSE & i < nrow(df)) { cont <- cont + 1 num <- df[i, 1] num_df[cont, 1] <- num num_df[cont, 2] <- 0 } } library(dplyr) library(tidyr) res_df <- num_df %>% group_by(nume, letra) %>% summarize( res = n()) %>% spread( letra, res) res_df[is.na(res_df)] <- 0 res_df #----------------- Que produce este resultado:> res_df# A tibble: 3 x 4 # Groups: nume [3] nume `0` A B <dbl> <dbl> <dbl> <dbl> 1 3. 0. 1. 1. 2 4. 1. 0. 0. 3 5. 0. 3. 0. Saludos, Carlos Ortega www.qualityexcellence.es El 9 de marzo de 2018, 16:02, <Guillermo.Vinue en uv.es> escribió:> Hola, > > Estoy intentando averiguar cómo contar el número de categorías situadas > después de ciertos valores. Por ejemplo, en el siguiente vector: > > x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3) > > el resultado que quisiera obtener es: > > Valor -> Resultado > 3 -> 1 A y 1 B > 4 -> 0 A y 0 B > 5 -> 3 A y 0 B > > ¿Alguien tiene alguna sugerencia?. > > Muchas gracias de antemano. > > Guillermo > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Guillermo.Vinue en uv.es
2018-Mar-12 15:43 UTC
[R-es] Contar categorías después de ciertos valores
Muchas gracias Carlos y Javier por la ayuda. Saludos, Guillermo> Hola, > > Esta es una forma... > > #----------------- > > x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3) > x_n <- as.numeric(x) > > cat_val <- unique(x[is.na(x_n)]) > num_val <- x_n[!is.na(x_n)] > > df <- data.frame( > x_n = x_n, > y = 1:length(x_n), > x = x, > x_l = is.na(df$x_n) > ) > > num_df <- data.frame( nume = 0, letra = 0) > cont <- 0 > for(i in 1:nrow(df)) { > if (df[i, 4] == FALSE & df[i + 1, 4] != FALSE & i < nrow(df)) { > num <- df[i, 1] > } > if (df[i, 4] != FALSE) { > cont <- cont + 1 > num_df[cont, 1] <- num > num_df[cont, 2] <- as.vector(df[i, 3]) > } > if (df[i, 4] == FALSE & df[i + 1, 4] == FALSE & i < nrow(df)) { > cont <- cont + 1 > num <- df[i, 1] > num_df[cont, 1] <- num > num_df[cont, 2] <- 0 > } > > } > > > library(dplyr) > library(tidyr) > > res_df <- num_df %>% > group_by(nume, letra) %>% > summarize( res = n()) %>% > spread( letra, res) > > res_df[is.na(res_df)] <- 0 > res_df > > #----------------- > > > Que produce este resultado: > > > res_df > # A tibble: 3 x 4 > # Groups: nume [3] > nume `0` A B > <dbl> <dbl> <dbl> <dbl> > 1 3. 0. 1. 1. > 2 4. 1. 0. 0. > 3 5. 0. 3. 0. > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > El 9 de marzo de 2018, 16:02, <Guillermo.Vinue en uv.es> escribió: > > > Hola, > > > > Estoy intentando averiguar cómo contar el número de categorías situadas > > después de ciertos valores. Por ejemplo, en el siguiente vector: > > > > x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3) > > > > el resultado que quisiera obtener es: > > > > Valor -> Resultado > > 3 -> 1 A y 1 B > > 4 -> 0 A y 0 B > > 5 -> 3 A y 0 B > > > > ¿Alguien tiene alguna sugerencia?. > > > > Muchas gracias de antemano. > > > > Guillermo > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es en r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es >