【问题标题】:filter in levels and fetch a value过滤级别并获取一个值
【发布时间】:2020-11-09 20:46:04
【问题描述】:

我的情况有点复杂, 我正在经营一家诊所,我需要你的帮助:

我有一列是因子类型“c_code”,它有许多不同长度的级别。 在每一行中,我都有一个“会话”列,它指示客户端的会话号。 我正在尝试仅获取每个 c_code 级别的最高会话,并检查自该患者接受治疗以来是否已经超过一周。 这是我正在使用的 DF:

如您所见,我正在尝试使用这一行:

mutate(bigThan6= if_else(as.double(todayDate - date) > 6, 1, 0))

如果差异大于 6,则“bigThan6”列得到 1。

如果我不希望它在我的整个行中完成,我的问题 - 仅在图片中突出显示的那些:每个“c_code”级别中的最高会话

【问题讨论】:

  • c_code 是客户端标识符吗?
  • 如果您提供的是可复制/可粘贴的数据而不是图片,那么提供帮助会容易得多。 (无法在数据图片上测试代码!)您能否分享前 10 行的 dput(droplevels(your_data[1:10, ])),或分享不同的说明性数据子集?这将为我们复制/粘贴,并包括所有相关的类和结构信息。

标签: r dplyr tidyverse lubridate


【解决方案1】:

你可以这样做。

library(dplyr)

df %>%
  group_by(c_code) %>%
  mutate(bigThan6 = +(session == max(session) &
                      toDate - date > 6))

#   c_code session date       toDate     bigThan6
#   <chr>    <dbl> <date>     <date>        <int>
# 1 a            1 2020-01-01 2020-11-09        0
# 2 a            2 2020-01-10 2020-11-09        1
# 3 b            2 2020-01-20 2020-11-09        0
# 4 b            3 2020-01-23 2020-11-09        1
# 5 c            3 2020-11-07 2020-11-09        0
# 6 c            4 2020-11-08 2020-11-09        0

任意演示日期

df <- structure(list(c_code = c("a", "a", "b", "b", "c", "c"), session = c(1, 
2, 2, 3, 3, 4), date = structure(c(18262, 18271, 18281, 18284, 
18573, 18574), class = "Date"), toDate = structure(c(18575, 18575, 
18575, 18575, 18575, 18575), class = "Date")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))```

【讨论】:

  • 谢谢,它成功了。我了解您是如何按 c_code 分组的,您能否向我解释一下 +(session == max(session) 是如何工作的?+ 是什么意思?再次感谢!
  • @Ido:不客气。 session == max(session) 为会话中的最大值返回 TRUE,否则返回 FALSE+ 运算符将 lgl-vector 转换为包含零和一的 int-vector。
【解决方案2】:

未经测试,因为您尚未共享数据,但我认为这就是您想要的:

your_data %>%
  group_by(c_code) %>%
  mutate(
    big_than_6 = case_when(
      date < max(date) ~ NA_integer_,
      datediff(todayDate, date, "days") > 6 ~ 1L,
      TRUE ~ 0L 
  ))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多