Discussion:
[R-es] Contar categorías después de ciertos valores
G***@uv.es
2018-03-09 15:02:24 UTC
Permalink
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
Javier Marcuzzi
2018-03-09 16:39:59 UTC
Permalink
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
Post by G***@uv.es
Hola,
Estoy intentando averiguar cómo contar el número de categorías situadas
x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3)
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
https://stat.ethz.ch/mailman/listinfo/r-help-es
[[alternative HTML version deleted]]
Carlos Ortega
2018-03-09 20:43:59 UTC
Permalink
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

#-----------------
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
Hola,
Estoy intentando averiguar cómo contar el número de categorías situadas
x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3)
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
https://stat.ethz.ch/mailman/listinfo/r-help-es
--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
G***@uv.es
2018-03-12 15:43:13 UTC
Permalink
Muchas gracias Carlos y Javier por la ayuda.

Saludos,

Guillermo
Post by Carlos Ortega
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
#-----------------
Post by Carlos Ortega
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
Post by Carlos Ortega
Hola,
Estoy intentando averiguar cómo contar el número de categorías situadas
x <- c(3, "A", "B", 5, "A", 4, 5, "A", "A", 3)
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
https://stat.ethz.ch/mailman/listinfo/r-help-es
--
Saludos,
Carlos Ortega
www.qualityexcellence.es
Loading...