请考虑以下几点:
在类似于下面的例子的data.frame中,每名患者都记录了给药的日期。目标是计算“下一次治疗的时间”,即从一次治疗开始到下一次治疗开始的时间。data.frame中的所有其他列(此处未显示)都保存需要保留的不同信息。
我的方法如下所示:
library("dplyr")
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
db <- data.frame(id = c(rep("a", 5), rep("b", 3)),
date = c(rep(as.Date("2018-01-01"), 3),
rep(as.Date("2018-01-20"), 2),
rep(as.Date("2018-01-01"), 3)))
db
#> id date
#> 1 a 2018-01-01
#> 2 a 2018-01-01
#> 3 a 2018-01-01
#> 4 a 2018-01-20
#> 5 a 2018-01-20
#> 6 b 2018-01-01
#> 7 b 2018-01-01
#> 8 b 2018-01-01
db %>%
group_by(id) %>%
mutate(time.to.next = as.numeric(lead(date) - date))
#> Warning: package 'bindrcpp' was built under R version 3.4.4
#> # A tibble: 8 x 3
#> # Groups: id [2]
#> id date time.to.next
#> <fct> <date> <dbl>
#> 1 a 2018-01-01 0.
#> 2 a 2018-01-01 0.
#> 3 a 2018-01-01 19.
#> 4 a 2018-01-20 0.
#> 5 a 2018-01-20 NA
#> 6 b 2018-01-01 0.
#> 7 b 2018-01-01 0.
#> 8 b 2018-01-01 NA由reprex封装创建于2018-08-13 (v0.2.0)。
但是,我需要的是一个data.frame (或tibble),如下所示:
#> # A tibble: 8 x 3
#> # Groups: id [2]
#> id date time.to.next
#> <fct> <date> <dbl>
#> 1 a 2018-01-01 19.
#> 2 a 2018-01-01 19.
#> 3 a 2018-01-01 19.
#> 4 a 2018-01-20 NA
#> 5 a 2018-01-20 NA
#> 6 b 2018-01-01 NA
#> 7 b 2018-01-01 NA
#> 8 b 2018-01-01 NA问题:我如何实现每个组的所有值都是相同的,尽管唯一的计算值是一个组的最后一个观察值与后续组的第一个观察值之间的差异?
非常感谢。
发布于 2018-08-13 15:30:28
一种选择是首先删除id和date中的所有重复项,计算时间差,然后在id和date列上加入db:
db %>%
select(id, date) %>%
distinct() %>%
group_by(id) %>%
mutate(time.to.next = as.numeric(lead(date) - date)) %>%
inner_join(db)
#Joining, by = c("id", "date")
# A tibble: 8 x 3
# Groups: id [?]
# id date time.to.next
# <fct> <date> <dbl>
#1 a 2018-01-01 19
#2 a 2018-01-01 19
#3 a 2018-01-01 19
#4 a 2018-01-20 NA
#5 a 2018-01-20 NA
#6 b 2018-01-01 NA
#7 b 2018-01-01 NA
#8 b 2018-01-01 NA发布于 2018-08-13 15:33:29
另一种选择是计算每个date与该id的max(date)之间的距离,然后用NA替换零。
db <- data.frame(id = c(rep("a", 5), rep("b", 3)),
date = c(rep(as.Date("2018-01-01"), 3),
rep(as.Date("2018-01-20"), 2),
rep(as.Date("2018-01-01"), 3)))
library(dplyr)
db %>%
group_by(id) %>%
mutate(time.to.next = as.numeric(max(date) - date),
time.to.next = ifelse(time.to.next > 0, time.to.next, NA)) %>%
ungroup()
# # A tibble: 8 x 3
# id date time.to.next
# <fct> <date> <dbl>
# 1 a 2018-01-01 19
# 2 a 2018-01-01 19
# 3 a 2018-01-01 19
# 4 a 2018-01-20 NA
# 5 a 2018-01-20 NA
# 6 b 2018-01-01 NA
# 7 b 2018-01-01 NA
# 8 b 2018-01-01 NAhttps://stackoverflow.com/questions/51825716
复制相似问题