dplyr 中 mutate = case_when 内的干净代码
clean code inside of mutate = case_when in dplyr
我想知道是否可以缩短 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)
任何小费都会非常酷!提前谢谢你:)
你不需要这里的case_when
,你只需要一个group_by
find.after <- function(data, expr) {
data %>%
group_by(id) %>%
mutate("a.{{expr}}" = lead({{expr}}))
}
这样你总是只在同一个id
内寻找下一个值
我想知道是否可以缩短 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)
任何小费都会非常酷!提前谢谢你:)
你不需要这里的case_when
,你只需要一个group_by
find.after <- function(data, expr) {
data %>%
group_by(id) %>%
mutate("a.{{expr}}" = lead({{expr}}))
}
这样你总是只在同一个id
内寻找下一个值