当前位置: 首页 > 知识库问答 >
问题:

提取重新连接的时间

皇甫飞跃
2023-03-14

我有一个结构如下的表格,其中包含有关俱乐部会员的信息

id  start       end          cancelled
1   2020-01-01  2020-12-31   2021-01-10
1   2021-02-01  2022-01-31   NA
2   2020-01-01  2020-12-31   NA
3   2020-01-01  2020-06-30   2020-07-01
3   2020-07-10  2021-01-09   2021-01-31
3   2021-02-02  2021-08-01   NA

我对后来重新加入的成员感兴趣。对于上述数据,在整个期间,ID1这样做了一次,ID2没有,而ID3这样做了两次。

每次发生这种情况,从他们的会员资格结束到他们重新加入的时间是多少?对于上述数据,这将是:

id  rejoin_date time_to_rejoin
1   2021-01-31  22 days 
3   2020-07-10  9 days
3   2021-02-02  2 days
structure(list(id = c(1, 1, 2, 3, 3, 3), start = c("2020-01-01", 
"2021-02-01", "2020-01-01", "2020-01-01", "2020-07-10", "2021-02-02"
), end = c("2020-12-31", "2022-01-31", "2020-12-31", "2020-06-30", 
"2021-01-09", "2021-08-01"), cancelled = c("2021-01-10", NA, 
NA, "2020-07-01", "2021-01-31", NA)), class = "data.frame", row.names = c(NA, 
-6L))

我很乐意得到使用R(理想情况下使用dplyr)或SQL(MySQL)的答案

共有2个答案

马丰
2023-03-14

您可以使用lag()然后筛选:

select t.*,
       datediff(cancelled, prev_cancelled) as num_days_since_cancel
from (select t.*,
             lag(cancelled) over (partition by id order by start) as prev_cancelled
      from t
     ) t
where prev_cancelled is not null;
董谦
2023-03-14

首先,更改为date类,任何人都不应该尝试计算character上的日期差异。

dat[,-1] <- lapply(dat[,-1], as.Date)
do.call(rbind, by(dat, dat$id, function(z) {
  if (nrow(z) == 1) return()
  data.frame(id = z$id[1], rejoin_date = z$start[-1],
             time_to_rejoin = as.numeric(z$start[-1] - z$cancelled[-nrow(z)], units="days"))
}))
#     id rejoin_date time_to_rejoin
# 1    1  2021-02-01             22
# 3.1  3  2020-07-10              9
# 3.2  3  2021-02-02              2
library(dplyr)
dat %>%
  group_by(id) %>%
  summarize(
    rejoin_date = start[-1],
    time_to_rejoin = as.numeric(start[-1] - cancelled[-n()], units="days")
  ) %>%
  ungroup()
# # A tibble: 3 x 3
#      id rejoin_date time_to_rejoin
#   <dbl> <date>               <dbl>
# 1     1 2021-02-01              22
# 2     3 2020-07-10               9
# 3     3 2021-02-02               2

dat %>%
  group_by(id) %>%
  summarize(
    rejoin_date = start[-1],
    time_to_rejoin = as.numeric(start - lag(cancelled), units="days")[-1]
  ) %>%
  ungroup()
library(data.table)
datDT <- as.data.table(dat)
datDT[, .(rejoin_date = start[-1],
          time_to_rejoin = as.numeric(start[-1] - cancelled[-.N], units="days")), by = .(id) ]
#       id rejoin_date time_to_rejoin
#    <num>      <Date>          <num>
# 1:     1  2021-02-01             22
# 2:     3  2020-07-10              9
# 3:     3  2021-02-02              2
 类似资料:
  • 我的Spring Hibernate Web应用程序在MySQL上运行,这给我带来了麻烦。 我四处寻找并尝试了不同的配置,在这个网站上阅读了相当多的帖子,但它仍然会弹出微笑的头像。 错误消息是:由:com.mysql.jdbc.exceptions.jdbc4.通信异常:从服务器成功接收到的最后一个数据包是63,313,144毫秒前。最后一个成功发送到服务器的数据包是63,313,144毫秒前。比

  • 我编写了一些逻辑,同时表示与exchange的近200个websocet连接。我使用第三方api,它基于org.eclipse.jetty.webSocket.api。我有一个我必须重写的方法。 我在stackoverflow上找到了这个问题,但我看不到清晰的答案。请帮忙,提前谢谢。

  • 重新建立mqtt连接,前提是必须已经通过Iot_id,Iot_pwd建立过一次mqtt连接。 请求方式: "|4|1|5|\r" 返回值: "|4|1|1|1|\r" mqtt连接状态:连接成功 "|4|1|1|2|reason|\r" mqtt连接状态:连接失败,字符串reason表示失败的原因 Arduino样例: softSerial.print("|4|1|5|\r");

  • 重新连接上一次连接的wifi。 请求方式: "|2|3|\r" 返回值: "|2|1|\r" wifi连接状态:wifi断开连接 "|2|2|\r" wifi连接状态:正在连接wifi "|2|3|ip|\r" wifi连接状态:wifi连接成功,返回OBLOQ的ip地址 "|2|4|\r" wifi连接状态:wifi连接失败,检查SSID和PWD是否输入正确 Arduino样例: softSer

  • 我有以下查询和方法 使用< code >域作为 我希望这个查询能够获取