首页 > 解决方案 > 从R中的另一个表信息创建一个表

问题描述

我有一个数据框 CLIENTS: 酒店编号 国籍 到达日期 出发日期 类似:

Client   Nationality   Hotel   Dateofarrive   DateofDeparture
Cl1          es         h1      21/07/2019    24/07/2019
Cl2          es         h1      23/07/2019    24/07/2019
Cl3          es         h1      06/07/2019    10/07/2019
Cl4          es         h2      05/07/2019    06/07/2019
Cl5          fr         h3      01/07/2019    02/07/2019
Cl6          pt         h1      07/07/2019    09/07/2019

而且我想要一个数据框酒店,对于数据框的每家酒店,我想要所有西班牙国籍的客户以及他们在酒店睡觉的所有夜晚,法国国籍和葡萄牙人也是如此。就像是:

Hotel    CliEspan  Nights  CliFrench Night CliPortug Night 
H1           3       8       0         0          1      2
H2           1       5       1         1          0      0

标签: rdataframe

解决方案


使用dplyr和的选项tidyr。我们将Dateofarrive和转换DateofDeparture为实际的 Date 对象,然后通过减去两个日期group_by Hotel以及每组中的总天数和条目总数Nationality来计算差异。sum转换为长格式,spread通过将缺失值填充为 0 将列合并为宽格式。

library(dplyr)
library(tidyr)

df %>%
  mutate_at(vars(Dateofarrive, DateofDeparture), as.Date, "%d/%m/%Y") %>%
  mutate(days = as.integer(DateofDeparture - Dateofarrive)) %>%
  group_by(Hotel, Nationality) %>%
  summarise(total = sum(days), 
             n = n()) %>%
  gather(key, value, total, n) %>%
  unite(col, Nationality, key, sep = "_") %>%
  spread(col, value, fill = 0)

推荐阅读