【问题标题】:clean code inside of mutate = case_when in dplyrdplyr 中 mutate = case_when 的干净代码
【发布时间】:2021-06-11 17:15:17
【问题描述】:

我想知道是否可以缩短这个 case_when() 语句中的代码。另一个重要目标是使 case_when() 语句中的长度(彼此之间滞后的时间量(...,n=xy))可变。 此函数的目的是找到最近的具有相同 id 的前导对象并为其分配一个值。 (但更多的是不写 10 次 n=1,2,3,4,5...)

这是我的代码:

  find.after <- function(data, expr) {
    data %>% mutate(
      "a.{{expr}}" := case_when(
        lead(id,1) == id ~ lead({{ expr }},1),
        lead(id,2) == id ~ lead({{ expr }},2),
        lead(id,3) == id ~ lead({{ expr }},3),
        lead(id,4) == id ~ lead({{ expr }},4),
        lead(id,5) == id ~ lead({{ expr }},5),
        lead(id,6) == id ~ lead({{ expr }},6),
        lead(id,7) == id ~ lead({{ expr }},7),
        lead(id,8) == id ~ lead({{ expr }},8),
        lead(id,9) == id ~ lead({{ expr }},9)
      )
    )
  }

tibble(id = rep(1:5,2), b = rep(c("a","b"),5)) %>%
  find.after(data = ., expr = b)

任何小费都会非常酷!提前谢谢你:)

【问题讨论】:

  • 嘿,dput(head(tibble(id = rep(1:5,2), b = rep(c("a","b"),5))) 会导致 structure(list(id = c(1L, 2L, 3L, 4L, 5L, 1L), b = c("a", "b", "a", "b", "a", "b"), a.b = c("b", "a", "b", "a", "b", NA)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
  • 你想得到什么输出?
  • 我尝试生成一个新列,其中包含满足条件的 b 的“最接近”值。但更重要的是,永远不要编写相同的代码超过彼此低于 3 倍的代码。 :-)

标签: r dplyr lapply case-when


【解决方案1】:

这里不需要case_when,只需要group_by

find.after <- function(data, expr) {
  data %>% 
    group_by(id) %>% 
    mutate("a.{{expr}}" = lead({{expr}}))
}

这样你总是只在同一个id 中寻找下一个值

【讨论】:

  • 我没想到解决这些问题会这么容易!我想在这种情况下,没有用例可以像在原始帖子中那样通过 apply 左右来创建这种奇怪的条件。 (我试图找到)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多