首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中像SQL Windows函数那样计算天差

如何在R中像SQL Windows函数那样计算天差
EN

Stack Overflow用户
提问于 2017-12-19 22:38:12
回答 3查看 43关注 0票数 0

输入:

目标:

创建一个名为“dayDifference”的新列,其规则如下:对于每一对“item-city”对,计算相关对的日差。

期望输出:

  • 第1行和第2行比萨-柏林对应3,因为在2月2日至2月4日之间有3天。
  • 第三行比萨-哈姆堡对应0,因为没有日差。
  • 第四排和第五排帕斯塔-哈姆堡对应于21,因为从10到20有21天。
  • 第6行对Pasta-柏林对应0,因为没有日差。

信息:当然可以有超过2行(例如,我可以有一对‘比萨饼-柏林’100行:如果是的话,总是取最大值(日期),并减到最小(日期)比萨饼-柏林一对。

约束:

需要在R中完成,例如没有与数据库的外部连接

源代码:

代码语言:javascript
复制
df <- structure(list(id = c(4848L, 4887L, 4899L, 4811L, 4834L, 4892L
), item = structure(c(2L, 2L, 2L, 1L, 1L, 1L), .Label = c("Pasta", 
"Pizza"), class = "factor"), city = structure(c(1L, 1L, 2L, 2L, 
2L, 1L), .Label = c("Berlin", "Hamburg"), class = "factor"), 
    date = structure(c(17199, 17201, -643892, 17449, 17459, 17515
    ), class = "Date")), .Names = c("id", "item", "city", "date"
), row.names = c(NA, -6L), class = "data.frame")
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-19 23:35:09

Reduce是一个很棒的功能

代码语言:javascript
复制
library(dplyr)
df %>% 
  group_by(item, city) %>% 
  mutate(dayDifference=abs(Reduce(`-`, as.numeric(range(date)))))

# A tibble: 6 x 5
# Groups:   item, city [4]
     id   item    city       date dayDifference
  <int> <fctr>  <fctr>     <date>         <dbl>
1  4848  Pizza  Berlin 2017-02-02             2
2  4887  Pizza  Berlin 2017-02-04             2
3  4899  Pizza Hamburg 0207-02-01             0
4  4811  Pasta Hamburg 2017-10-10            10
5  4834  Pasta Hamburg 2017-10-20            10
6  4892  Pasta  Berlin 2017-12-15             0
票数 1
EN

Stack Overflow用户

发布于 2017-12-19 23:26:15

我会用data.table来做

代码语言:javascript
复制
library(data.table)
setDT(df)
df[, min_date := min(date), by = c("item", "city")]
df[, max_date := max(date), by = c("item", "city")]
df[, dayDifference := difftime(max_date, min_date, units = "days")]
df[, c("min_date", "max_date") := NULL]

它将为您提供所需的输出:

代码语言:javascript
复制
id  item    city       date             dayDifference
1: 4848 Pizza  Berlin 2017-02-02        2 days
2: 4887 Pizza  Berlin 2017-02-04        2 days
3: 4899 Pizza Hamburg 0207-02-01        0 days
4: 4811 Pasta Hamburg 2017-10-10       10 days
5: 4834 Pasta Hamburg 2017-10-20       10 days
6: 4892 Pasta  Berlin 2017-12-15        0 days

您还可以使用df[, dayDifference := max_date - min_date]而不是df[, dayDifference := difftime(max_date, min_date, units = "days")]

票数 2
EN

Stack Overflow用户

发布于 2017-12-19 23:17:30

不漂亮但是..。

代码语言:javascript
复制
i<-unique(lapply(1:nrow(df),function(x) which(paste(df[,2],df[,3]) %in% paste(df[x,2],df[x,3]))))
for(j in 1:length(i)) df[i[[j]],"days"]<-abs(difftime(df[i[[j]],][1,"date"],df[i[[j]],][2,"date"]))

> df
    id  item    city       date days
1 4848 Pizza  Berlin 2017-02-02    2
2 4887 Pizza  Berlin 2017-02-04    2
3 4899 Pizza Hamburg 0207-02-01   NA
4 4811 Pasta Hamburg 2017-10-10   10
5 4834 Pasta Hamburg 2017-10-20   10
6 4892 Pasta  Berlin 2017-12-15   NA
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47896228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档