Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从具有开始/结束日期的行创建年序列行的数据框_R_Date_Sequence_Lubridate - Fatal编程技术网

R 从具有开始/结束日期的行创建年序列行的数据框

R 从具有开始/结束日期的行创建年序列行的数据框,r,date,sequence,lubridate,R,Date,Sequence,Lubridate,一般来说,我是R和编码的新用户,我已经搜索过了,但无法解决这个问题。我有以下数据: groupid start.date end.date Status 1 2014-01-01 2017-01-01 A 1 2018-01-01 2020-01-01 D 2 2014-01-01 2017-01-01 B 如何生成一个数据帧,其中每个观察值都是一年,而不是groupid和时间段的组合 我想要的输出是: groupid

一般来说,我是R和编码的新用户,我已经搜索过了,但无法解决这个问题。我有以下数据:

groupid  start.date   end.date    Status
1        2014-01-01   2017-01-01  A
1        2018-01-01   2020-01-01  D
2        2014-01-01   2017-01-01  B
如何生成一个数据帧,其中每个观察值都是一年,而不是groupid和时间段的组合

我想要的输出是:

groupid  year   status
1        2014  A
1        2015  A
1        2016  A
1        2017  A
1        2018  D
1        2019  D
1        2020  D
2        2014  B
2        2015  B
2        2016  B
2        2017  B
我尝试了很多方法,但我认为我最好的尝试是:

df <- df %>% 
group_by(rn=row_number()) %>% 
  mutate(d = list(seq(start.date, end.date, by='1 year'))) 
%>%
  unnest()
搜索错误并没有帮助我更接近于找出问题所在。Start.date和end.date存储为日期。如果有关系的话,它们是由两列向量生成的,只有四位数的年份号,因此我应用了以下代码将它们更改为可用的日期格式:

df$start.date <- as.Date(ISOdate(df$from, 1, 1)) 
df$end.date <- as.Date(ISOdate(df$to, 1, 1))  

你快到了!根据ID和状态对数据进行分组,因为这两个变量的组合是开始和结束日期的来源

图书馆管理员 df%已读_表2 df%>% 按组ID分组,状态%>% mutatedates=listseqfrom=start.date,to=end.date,by=1年%>% 不耐烦 >A tibble:11 x 5 >组:groupid,状态[3] >groupid start.date end.date状态日期 > >1 1 2014-01-01 2017-01-01 A 2014-01-01 >2 1 2014-01-01 2017-01-01 A 2015-01-01 >31 2014-01-01 2017-01-01 A 2016-01-01 >412014-01-01 2017-01-01 A 2017-01-01 >2018-01-01 2020-01-01 D 2018-01-01 >2018-01-01 2020-01-01 D 2019-01-01 >7.1 2018-01-01 2020-01-01 D 2020-01-01 >8.2 2014-01-01 2017-01-01 B 2014-01-01 >9.2 2014-01-01 2017-01-01 B 2015-01-01 >1022014-01-01 2017-01-01 B 2016-01-01 >11.2 2014-01-01 2017-01-01 B 2017-01-01 要获取所需的格式,可以从日期序列中提取年份,并删除额外的列:

df%>% 按组ID分组,状态%>% mutatedates=listseqfrom=start.date,to=end.date,by=1年%>% 最新%>% mutateyear=lubridate::yeardates%>% 选择GroupID、年份、状态 >一个tibble:11x3 >组:groupid,状态[3] >groupid年份状态 > >1 2014年1月A日 >2.1 2015 A >3.1 2016 A >4.1 2017 A >5 1 2018 D >612019 D >7 1 2020 D >8.2 2014 B >9.2 2015年B >10.2 2016 B >11.2 2017 B 由v0.2.0于2018年6月22日创建。

的答案基于groupid和Status组合唯一的隐含假设。然而,这不能保证。此外,为了安全起见,OP自己选择按行号分组

分组是必需的,因为seq和单冒号运算符:不接受vetors作为输入

dplyr/tidyr溶液 这种方法按行号分组,并在创建序列之前提取年份。 df1是OP给出的TIBLE,请参见下面的数据部分

library(dplyr)
library(tidyr)
library(lubridate)
df1 %>% 
  group_by(rn = row_number()) %>% 
  mutate(year = list(year(start.date):year(end.date))) %>% 
  unnest() %>% 
  ungroup() %>% 
  select(groupid, year, Status)
OP的原始问题 OP披露了start.date和end.date是由两个只有四位数年号的列向量生成的

没有必要事先将这些年份数字转换为日期。它们可以直接用于创建年份序列:

library(dplyr)
library(tidyr)
df2 %>% 
  group_by(rn = row_number()) %>% 
  mutate(year = list(from:to)) %>% 
  unnest() %>% 
  ungroup() %>% 
  select(groupid, year, Status)
根据help:,字符参数被强制为数字,因此不需要显式协同

数据
非常感谢你!非常感谢。非常有用
# A tibble: 11 x 3
   groupid  year Status
     <int> <int> <chr> 
 1       1  2014 A     
 2       1  2015 A     
 3       1  2016 A     
 4       1  2017 A     
 5       1  2018 D     
 6       1  2019 D     
 7       1  2020 D     
 8       2  2014 B     
 9       2  2015 B     
10       2  2016 B     
11       2  2017 B
library(data.table)
setDT(df1)[, .(groupid, year = year(start.date):year(end.date), Status), 
  by = .(rn = 1:nrow(df1))][
    , rn := NULL][] 
    groupid year Status
 1:       1 2014      A
 2:       1 2015      A
 3:       1 2016      A
 4:       1 2017      A
 5:       1 2018      D
 6:       1 2019      D
 7:       1 2020      D
 8:       2 2014      B
 9:       2 2015      B
10:       2 2016      B
11:       2 2017      B
library(dplyr)
library(tidyr)
df2 %>% 
  group_by(rn = row_number()) %>% 
  mutate(year = list(from:to)) %>% 
  unnest() %>% 
  ungroup() %>% 
  select(groupid, year, Status)
# A tibble: 11 x 3
   groupid  year Status
     <int> <int> <chr> 
 1       1  2014 A     
 2       1  2015 A     
 3       1  2016 A     
 4       1  2017 A     
 5       1  2018 D     
 6       1  2019 D     
 7       1  2020 D     
 8       2  2014 B     
 9       2  2015 B     
10       2  2016 B     
11       2  2017 B
library(data.table)
setDT(df2)[, .(groupid, year = from:to, Status), by = .(rn = 1:nrow(df2))][
    , rn := NULL][] 
df1 <- readr::read_table(
  "groupid  start.date   end.date    Status
1        2014-01-01   2017-01-01  A
1        2018-01-01   2020-01-01  D
2        2014-01-01   2017-01-01  B"
)

df2 <- readr::read_table(
  "groupid  from   to    Status
1        2014   2017  A
1        2018   2020  D
2        2014   2017  B"
)