2017-06-14 53 views
-1

我正在寻找一种方法将df导入dfres。按日期分组并将行折叠为一个列

Dfres是

obj <- date  #where type == I5, 
min <- min(date) #where type == I6, 
max <- max(date) #where type == I6, 

所有这一切都通过年度区分。

year <- c('2014','2015','2016','2017','2014','2015','2016','2017','2016','2014','2015') 
type <- c('I6','I6','I6','I6','I6','I6','I6','I6','I5','I5','I5') 
date <- c('2014-06-03','2015-08-01','2016-06-01','2017-05-15', 
'2014-04-11','2015-03-14','2016-03-17','2017-03-08','2016-11-05', 
'2014-09-04','2015-05-01') 
df <- data.frame(year,type,date) 

year <- c('2014','2015','2016','2017') 
obj <- c('2014-09-04','2015-05-01','2016-11-05',NA) 
min <- c('2014-04-11','2015-03-14','2016-03-17','2017-03-08') 
max <- c('2014-06-03', '2015-08-01','2016-06-01','2017-05-15') 
dfres <- data.frame(year,obj,min,max) 

如果有人能帮助我,没有准备的数据,以便围绕解决这个问题的一种方式,但一个“容易”的方式抛出了一句,我会很优雅。

回答

1

使用dplyr将是一个想法,

library(dplyr) 

df %>% 
filter(type == 'I6') %>% 
group_by(year) %>% 
summarise(min_d = min(date), max_d = max(date)) %>% 
full_join(df[df$type == 'I5',], ., by = 'year') %>% 
select(-type) %>% 
arrange(year) 

# year  date  min_d  max_d 
#1 2014 2014-09-04 2014-04-11 2014-06-03 
#2 2015 2015-05-01 2015-03-14 2015-08-01 
#3 2016 2016-11-05 2016-03-17 2016-06-01 
#4 2017  <NA> 2017-03-08 2017-05-15 
1

一个data.table的做法是:

library(data.table) 
setDT(df) 
i5 <- df[type == 'I5', .(obj = date), by = year] 
i6 <- df[type == 'I6', .(min = min(as.Date(date)), max = max(as.Date(date))), by = year] 
dfres <- merge(i5, i6, by = 'year', all = TRUE)