繁体   English   中英

R:如何根据数据框的值添加行?

[英]R: How can I add rows based on values of a data frame?

目前,我有两个要合并的数据框。 数据框 A包含酒店房间的每日能源和用水量数据,数据框 B包含有关住在房间里的人的信息。 为了匹配数据帧 A的数据结构,我需要解决以下关于数据帧 B的问题。

数据框 B当前如下所示:

   `Person ID``                     `Apartment`                    `contract_start`         `contract_end`
   <chr>                             <chr>                          <date>                   <date>                
 1 hnd48                             T217                           2021-09-16               2021-09-18            
 2 jFDJu                             T217                           2021-09-19               2021-09-21            
 3 kqKcX                             A705                           2021-09-16               2021-09-19            

为了匹配数据框 A的数据结构,一个人住在酒店房间内的每一天都需要是一个新行。 因此,我想添加一个新列“日期”,该列从“contract_start”日开始到“contract_end”日结束,计算一个人在房间内居住的每一天。 因此,理想情况下,数据框应如下所示:

   `Person ID``                     `Apartment`                    `dates`         
   <chr>                             <chr>                          <date>                                 
 1 hnd48                             T217                           2021-09-16
 2 hnd48                             T217                           2021-09-17
 3 hnd48                             T217                           2021-09-18                           
 4 jFDJu                             T217                           2021-09-19
 5 jFDJu                             T217                           2021-09-20
 6 jFDJu                             T217                           2021-09-21                            
 7 kqKcX                             A705                           2021-09-16
 8 kqKcX                             A705                           2021-09-17
 9 kqKcX                             A705                           2021-09-18
 10kqKcX                             A705                           2021-09-19                             

我怎么能用代码做到这一点?

最好的问候,文森特

library(tidyverse)
df = tribble(
  ~`Person ID`, ~Apartment, ~contract_start, ~contract_end,
  "hnd48", "T217", "2021-09-16", "2021-09-18",
  "jFDJu", "T217", "2021-09-19", "2021-09-21", 
  "kqKcX", "A705", "2021-09-16", "2021-09-19"
) %>%
  mutate(across(c(contract_start, contract_end), as.Date)) 

df %>% 
  rowwise() %>% 
  mutate(
    dates = paste0(
      as.character(
        seq(contract_start, contract_end, by = "days")
        ), collapse = ",")
    ) %>%
  select(-c(contract_start, contract_end)) %>% 
  separate_rows(dates, sep = ",") %>% 
  mutate(dates = as.Date(dates))
# A tibble: 10 x 3
   `Person ID` Apartment dates     
   <chr>       <chr>     <date>    
 1 hnd48       T217      2021-09-16
 2 hnd48       T217      2021-09-17
 3 hnd48       T217      2021-09-18
 4 jFDJu       T217      2021-09-19
 5 jFDJu       T217      2021-09-20
 6 jFDJu       T217      2021-09-21
 7 kqKcX       A705      2021-09-16
 8 kqKcX       A705      2021-09-17
 9 kqKcX       A705      2021-09-18
10 kqKcX       A705      2021-09-19

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM