首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr:使用data.frame ()后分组的填充系列

dplyr:使用data.frame ()后分组的填充系列
EN

Stack Overflow用户
提问于 2018-08-13 15:25:04
回答 2查看 133关注 0票数 0

请考虑以下几点:

在类似于下面的例子的data.frame中,每名患者都记录了给药的日期。目标是计算“下一次治疗的时间”,即从一次治疗开始到下一次治疗开始的时间。data.frame中的所有其他列(此处未显示)都保存需要保留的不同信息。

我的方法如下所示:

代码语言:javascript
复制
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),如下所示:

代码语言:javascript
复制
#> # 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

问题:我如何实现每个组的所有值都是相同的,尽管唯一的计算值是一个组的最后一个观察值与后续组的第一个观察值之间的差异?

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-13 15:30:28

一种选择是首先删除id和date中的所有重复项,计算时间差,然后在id和date列上加入db

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-08-13 15:33:29

另一种选择是计算每个date与该id的max(date)之间的距离,然后用NA替换零。

代码语言:javascript
复制
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           NA
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51825716

复制
相关文章

相似问题

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