Tengo una pregunta, cómo eliminar valores duplicados para una sola marca de tiempo. Tengo un gran dato que tiene millones de filas. Así es como se ve mi marco de datos de muestra con problema:

     Name <-c('PP_1','PP_1','PP_1','PP_1','PP_1')
     category<-c('GT','GT','GT','GT','GT')
     year<-c('2025','2025','2025','2025','2025')
     month<-c('12','12','12','12','12')
     day <-c('30','30','30','30','30')
     period<-c('1','1','1','1','1')
     value<-c('53.55','0.00','0.00','0.00','0.00')
     df<-data.frame(Name,category,year,month,day,period,value)

¿Cómo puedo deshacerme de estos valores múltiples no deseados (aquí ceros) para el mismo timetsamp? Me gustaría mantener el valor más alto, p. '53 .55 'y elimine todos los ceros durante el mismo período de tiempo. Se supone que el df final debe parecerse

Name <-c('PP_1')
 category<-c('GT')
 year<-c('2025')
 month<-c('12')
 day <-c('30')
 period<-c('1')
 value<-c('53.55')
 df<-data.frame(Name,category,year,month,day,period,value)

Hay múltiples Names en el marco de datos y values para todo el año y cuando uso reshape_df<- tidyr::spread(df,Name,value) me da Error: Each row of output must be identified by a unique combination of keys. Keys are shared for 1032 rows. Estaba intentando con la función df%>% gather(Name,year, month, day, period, value) pero no tuve suerte. ¿Podría alguien ayudarme a obtener la solución correcta? gracias por adelantado.

1
M. T. 25 jun. 2020 a las 12:57

2 respuestas

¿Qué tal subset?

subset(df, subset=!duplicated(cbind(Name, category, year, month, day, period)))
#  Name category year month day period value
#1 PP_1       GT 2025    12  30      1 53.55

Esto mantendrá el primer registro de cada combinación de las variables especificadas. Si debe usar dplyr, intente filter:

library(dplyr)
filter(df, !duplicated(cbind(Name, year, month, day, period)))

La definición de "unicidad" dependerá de qué variables coloque en el filtro.

0
Edward 25 jun. 2020 a las 10:21

Usted podría usar

library(dplyr)

df %>%
  group_by(across(-value)) %>%
  mutate(value = as.numeric(as.character(value))) %>%
  filter(value==max(value), .preserve = TRUE)

Que regresa

  Name  category year  month day   period value
  <fct> <fct>    <fct> <fct> <fct> <fct>  <dbl>
1 PP_1  GT       2025  12    30    1       53.6
0
Martin Gal 25 jun. 2020 a las 10:26