Estoy tratando de crear una nueva columna (llamada Error_1_Count) en mi marco de datos que cuenta la cantidad de veces que 'Error Type 1' aparece en una columna llamada 'Error' para cada valor diferente de 'Nombre'. A continuación se muestra un ejemplo de lo que me gustaría que fuera mi marco de datos resultante.

Intenté crear un bucle con una asignación basada en el error (ver más abajo), sin embargo, el conteo no es correcto en mi salida (solo da como resultado 0 y 1).

Avíseme cómo puedo mejorar mi código y asegúrese de que el recuento solo se restablezca para los nuevos valores de 'Nombre'. ¡Gracias!

Goal Result in Table


Name       Error         Error_1_Count
A       Error Type 1          1
A       Error Type 4          1
A       Error Type 1          2
B       Error Type 2          0
A       Error Type 1          3
C       Error Type 3          0
D       Error Type 1          1


names <- unique(data.df$name)
count <- 0

for (i in names) {

  data.df[data.df$name == i, data.df$error_1_count <- ifelse(data.df$error == 'Error Type 1', count + 1, count)]

}


#View(data.df)
#print(unique(data.df$error_1_count))


r
3
ava 4 dic. 2019 a las 18:26

2 respuestas

La mejor respuesta

Puede usar ave y cumsum.

x$Error_1_Count <- ave(x$Error == "Error Type 1", x$Name, FUN=cumsum)
x
#  Name        Error Error_1_Count
#1    A Error Type 1             1
#2    A Error Type 4             1
#3    A Error Type 1             2
#4    B Error Type 2             0
#5    A Error Type 1             3
#6    C Error Type 3             0
#7    D Error Type 1             1

Datos:

x <- structure(list(Name = structure(c(1L, 1L, 1L, 2L, 1L, 3L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), Error = structure(c(1L, 4L, 
1L, 2L, 1L, 3L, 1L), .Label = c("Error Type 1", "Error Type 2", 
"Error Type 3", "Error Type 4"), class = "factor")), row.names = c(NA, 
-7L), class = "data.frame")
3
GKi 4 dic. 2019 a las 15:29

Una idea similar con dplyr

library(dplyr)
df1 %>%
     group_by(Name) %>%
     mutate(Error = cumsum(Error == "Error Type 1"))

Datos

df1 <- structure(list(Name = c("A", "A", "A", "B", "A", "C", "D"), Error = c("Error Type 1", 
"Error Type 4", "Error Type 1", "Error Type 2", "Error Type 1", 
"Error Type 3", "Error Type 1")), row.names = c(NA, -7L), class = "data.frame")
3
akrun 4 dic. 2019 a las 15:31