首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dplyr -根据R中其他列的最低值选择列中的值

Dplyr -根据R中其他列的最低值选择列中的值
EN

Stack Overflow用户
提问于 2021-10-08 11:21:16
回答 3查看 64关注 0票数 1

我目前正在处理一个数据集,每个患者ID都有多个活检。我需要找到最接近特定日期的活检结果(每个患者都有)。可以在下面看到一个虚拟数据集

代码语言:javascript
复制
df <- data.frame(m1 = c("1","1","1","2","2","2"), 
                 patodate=c("2013-06-03","2014-01-06","2018-11-23","2004-03-03","2018-06-25","2018-12-19"), 
                 baselinedate=c("2018-11-09","2018-11-09","2018-11-09","2018-07-24","2018-07-24","2018-07-24"),
                 biopsy=c("1","2","3","1","2","3"))

然后我计算了patodate和baselinedate之间的时间差。

代码语言:javascript
复制
df$patodate <- as.Date(df$patodate)
df$baselinedate <- as.Date(df$baselinedate)

df <- df%>%
  group_by(m1) %>%
  mutate(diff = baselinedate-recdate)

我现在的问题是-我想添加一个名为'status‘的新列,它显示(按组m1)时间差最接近于0的’活检‘结果。最终结果将是

代码语言:javascript
复制
df <- data.frame(m1 = c("1","1","1","2","2","2"), 
                 patodate=c("2013-06-03","2014-01-06","2018-11-23","2004-03-03","2018-06-25","2018-12-19"), 
                 baselinedate=c("2018-11-09","2018-11-09","2018-11-09","2018-07-24","2018-07-24","2018-07-24"),
                 biopsy=c("1","2","3","1","2","3"),
                 status=c("3","3","3","2","2","2"))

我希望有人能理解这个问题,并能提供帮助。非常感谢

致以亲切的问候,

托比亚斯·伯格

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-08 19:59:03

我们可能会做

代码语言:javascript
复制
library(dplyr)
df %>%
     group_by(m1) %>%
     mutate(status =  abs(patodate - baselinedate),
          status = which(status == min(status))[1]) %>% 
     ungroup

-output

代码语言:javascript
复制
# A tibble: 6 × 5
  m1    patodate   baselinedate biopsy status
  <chr> <date>     <date>       <chr>   <int>
1 1     2013-06-03 2018-11-09   1           3
2 1     2014-01-06 2018-11-09   2           3
3 1     2018-11-23 2018-11-09   3           3
4 2     2004-03-03 2018-07-24   1           2
5 2     2018-06-25 2018-07-24   2           2
6 2     2018-12-19 2018-07-24   3           2
票数 1
EN

Stack Overflow用户

发布于 2021-10-08 11:27:49

您可以获得每组日期之间差异的最小绝对值的索引。

代码语言:javascript
复制
library(dplyr)

df %>%
  group_by(m1) %>%
  mutate(status = which.min(abs(patodate - baselinedate))) %>%
  ungroup

#  m1    patodate   baselinedate biopsy status
#  <chr> <date>     <date>       <chr>   <int>
#1 1     2013-06-03 2018-11-09   1           3
#2 1     2014-01-06 2018-11-09   2           3
#3 1     2018-11-23 2018-11-09   3           3
#4 2     2004-03-03 2018-07-24   1           2
#5 2     2018-06-25 2018-07-24   2           2
#6 2     2018-12-19 2018-07-24   3           2
票数 1
EN

Stack Overflow用户

发布于 2021-10-08 12:10:51

以下是另一种方法:

代码语言:javascript
复制
library(dplyr)
library(lubridate)
df %>% 
  group_by(m1) %>% 
  mutate(across(contains("date"), ymd),
         helper = abs(difftime(baselinedate,patodate))) %>% 
  mutate(status = biopsy[helper==min(helper)]) %>% 
  select(-helper)
代码语言:javascript
复制
  m1    patodate   baselinedate biopsy status
  <chr> <date>     <date>       <chr>  <chr> 
1 1     2013-06-03 2018-11-09   1      3     
2 1     2014-01-06 2018-11-09   2      3     
3 1     2018-11-23 2018-11-09   3      3     
4 2     2004-03-03 2018-07-24   1      2     
5 2     2018-06-25 2018-07-24   2      2     
6 2     2018-12-19 2018-07-24   3      2  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69495031

复制
相关文章

相似问题

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