通过在r中保留唯一值来重塑数据框

时间:2020-06-25 09:57:10

标签: r dplyr

我有一个问题,如何删除单个时间戳的重复值。 我有一个拥有数百万行的大数据。 这是我的有问题的示例数据帧的样子:

     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)
     df<-transform(df, Name = as.character(Name),category =  as.character(category),year = as.integer(year),
          month = as.integer(month),day = as.integer(day),period = as.numeric(period),value = as.numeric(value))

如何为相同的时间戳清除这些多余的多个值(此处为零)?就像,我想保持最高的价值,例如'53 .55'并删除同一时间段内的所有零 最终的df应该看起来像

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)

数据帧中有多个Names,全年中有values,当我使用reshape_df<- tidyr::spread(df,Name,value)时,它会给我Error: Each row of output must be identified by a unique combination of keys. Keys are shared for 1032 rows。我正在尝试使用df%>% gather(Name,year, month, day, period, value)函数,但是没有运气。有人可以帮助我获得正确的解决方案吗? 预先感谢。

2 个答案:

答案 0 :(得分:1)

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

这将保留指定变量的每个组合的第一条记录。如果必须使用dplyr,请尝试filter

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

“唯一性”的定义取决于您在过滤器中放置的变量。

答案 1 :(得分:1)

您可以使用

library(dplyr)

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

返回

  Name  category year  month day   period value
  <fct> <fct>    <fct> <fct> <fct> <fct>  <dbl>
1 PP_1  GT       2025  12    30    1       53.6