首页 > 解决方案 > 从日期范围中提取日期并赋值

问题描述

我有以下数据框:

Date_from <- c("2013-01-01","2013-01-04")
Date_to <- c("2013-01-03","2013-01-06")
Parameter <- c("Par1","Par1","Par2","Par2")
conc<-c("1.5","2.5","1.5","1.8")
metals<-data.frame(Date_from,Date_to,Parameter,conc)
metals$Date_from<-as.Date(metals$Date_from)
metals$Date_to<-as.Date(metals$Date_to)
metals$conc<-as.numeric(as.character(metals$conc))

我需要做的是提取每个参数的每个日期范围内的日期,并将浓度值分配给该范围内的每个日期,并将所有这些信息放在一个新的数据框中。结果应如下所示:

Date        Parameter    conc
2013-01-01  Par1         1.5
2013-01-02  Par1         1.5
2013-01-03  Par1         1.5
2013-01-04  Par1         2.5
2013-01-05  Par1         2.5
2013-01-06  Par1         2.5
2013-01-01  Par2         1.5
2013-01-02  Par2         1.5
2013-01-03  Par2         1.5
2013-01-04  Par2         1.8
2013-01-05  Par2         1.8
2013-01-06  Par2         1.8

标签: r

解决方案


这是一个选项tidyverse。通过将'Date_from' 影响到 'Date_to' ( )创建一个list列,删除不需要的列 ( ) 和seqmapselectunnest

library(tidyverse)
metals %>% 
   mutate(Date = map2(Date_from, Date_to, seq, by = "1 day")) %>% 
   select(-Date_from, -Date_to) %>%
   unnest %>%
   select(Date, Parameter, conc)
#          Date Parameter conc
#1  2013-01-01      Par1  1.5
#2  2013-01-02      Par1  1.5
#3  2013-01-03      Par1  1.5
#4  2013-01-04      Par1  2.5
#5  2013-01-05      Par1  2.5
#6  2013-01-06      Par1  2.5
#7  2013-01-01      Par2  1.5
#8  2013-01-02      Par2  1.5
#9  2013-01-03      Par2  1.5
#10 2013-01-04      Par2  1.8
#11 2013-01-05      Par2  1.8
#12 2013-01-06      Par2  1.8

或者它可以用base R

lst <- Map(seq, MoreArgs = list(by = "1 day"), metals$Date_from, metals$Date_to)
out <- cbind(Date = do.call(c, lst), metals[rep(seq_len(nrow(metals)),
          lengths(lst)), c("Parameter", "conc")])
row.names(out) <- NULL
out
#         Date Parameter conc
#1  2013-01-01      Par1  1.5
#2  2013-01-02      Par1  1.5
#3  2013-01-03      Par1  1.5
#4  2013-01-04      Par1  2.5
#5  2013-01-05      Par1  2.5
#6  2013-01-06      Par1  2.5
#7  2013-01-01      Par2  1.5
#8  2013-01-02      Par2  1.5
#9  2013-01-03      Par2  1.5
#10 2013-01-04      Par2  1.8
#11 2013-01-05      Par2  1.8
#12 2013-01-06      Par2  1.8

推荐阅读