r - 从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
解决方案
使用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)
推荐阅读
- extjs - 将大括号作为 ExtJS 文本字段中的值转义
- python - (重新)从“备份”表描述创建表
- javascript - Javascript:正则表达式中的异常“如果前面没有”
- python - Pandas:快速随机负采样
- sql - SSAS 表格中的不同流程模式如何工作?
- python - 仅在 x 和 y 之间的列表中打印数字
- c# - 多上下文 - 使用身份框架上下文和实体框架 DbContext 的正确方法
- java - JDK11/JavaFX:如何在没有构建/依赖管理的情况下制作一个胖 jar?
- javascript - 表格中的响应式 c3 图表
- asp.net-core - 如何更改 Razor 组件中 HTML 文档头部的标题和其他 html 元素?