gpt4 book ai didi

r - 将 case_when 与 dplyr 一起使用

转载 作者:行者123 更新时间:2023-12-03 21:10:28 24 4
gpt4 key购买 nike

我正在尝试使用 dplyr 的新“跨”函数将 mutate_at() 转换为 mutate() 并且有点难倒。
简而言之,我需要将一系列列中的值与“基线”列进行比较。当列中的值高于基线时,我需要使用基线值。当列中的值低于或等于基线时,我需要保留该值。这是一个示例数据集(我的实际数据集要大得多):

test <- structure(list(baseline = c(5, 7, 8, 4, 9, 1, 0, 46, 47), bob = c(7, 
11, 34, 9, 6, 8, 3, 49, 12), sally = c(3, 5, 2, 2, 6, 1, 3, 4,
56), rita = c(6, 4, 6, 7, 6, 0, 3, 11, 3)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L), spec = structure(list(
cols = list(baseline = structure(list(), class = c("collector_double",
"collector")), bob = structure(list(), class = c("collector_double",
"collector")), sally = structure(list(), class = c("collector_double",
"collector")), rita = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))

我当前的代码使用 mutate_at() 并且工作正常:
trial1 <- test %>% 
mutate_at(
vars('bob','sally', 'rita'),
funs(case_when(
. > baseline ~ baseline,
. <= baseline ~ .)))

但是当我尝试更新它以反射(reflect) dplyr 1.0 的cross() 时,我不断收到错误消息。这是我的尝试:
trial2 <- test %>% 
mutate(across(c(bob, sally, rita),
case_when(. > baseline ~ baseline,
. <= baseline ~ .)))
这是错误:

error: Problem with mutate() input ..1.x . > baseline ~ baseline, . <= baseline ~ . must be length 36 or one, not 9, 4.ℹ Input ..1 is across(...)


任何想法我可能做错了什么? case_when() 是否适用于cross?

最佳答案

我们可以使用 ~指定匿名函数/lambda 函数调用

library(dplyr)
test %>%
mutate(across(c(bob, sally, rita),
~ case_when(. > baseline ~ baseline,
. <= baseline ~ .)))
-输出
# A tibble: 9 x 4
# baseline bob sally rita
# <dbl> <dbl> <dbl> <dbl>
#1 5 5 3 5
#2 7 7 5 4
#3 8 8 2 6
#4 4 4 2 4
#5 9 6 6 6
#6 1 1 1 0
#7 0 0 0 0
#8 46 46 4 11
#9 47 12 47 3

或与 .funs争论
test %>% 
mutate(across(c(bob, sally, rita),
.funs = case_when(. > baseline ~ baseline,
. <= baseline ~ .)))

根据 ?across fns 的参数可以是

Functions to apply to each of the selected columns. Possible values are:


NULL, to returns the columns untransformed.


A function, e.g. mean.


A purrr-style lambda, e.g. ~ mean(.x, na.rm = TRUE)


A list of functions/lambdas, e.g. list(mean = mean, n_miss = ~ sum(is.na(.x))



此外,而不是 case_when ,我们可以利用 pmin
test %>% 
mutate(across(c(bob, sally, rita), ~ pmin(baseline, .)))
-输出
# A tibble: 9 x 4
# baseline bob sally rita
# <dbl> <dbl> <dbl> <dbl>
#1 5 5 3 5
#2 7 7 5 4
#3 8 8 2 6
#4 4 4 2 4
#5 9 6 6 6
#6 1 1 1 0
#7 0 0 0 0
#8 46 46 4 11
#9 47 12 47 3

关于r - 将 case_when 与 dplyr 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64189561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com