[英]Using case_when with dplyr across
我正在嘗試使用 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 ~ .)))
但是當我嘗試更新它以反映 dplyr 1.0 的cross() 時,我不斷收到錯誤消息。 這是我的嘗試:
trial2 <- test %>%
mutate(across(c(bob, sally, rita),
case_when(. > baseline ~ baseline,
. <= baseline ~ .)))
這是錯誤:
錯誤:
mutate()
輸入問題..1
。 ×. > baseline ~ baseline
. > baseline ~ baseline
,. <= baseline ~ .
. <= baseline ~ .
長度必須是 36 或 1,而不是 9、4。 ℹ 輸入..1
是 crossacross(...)
任何想法我可能做錯了什么? 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
的參數可以是
應用於每個選定列的函數。 可能的值為:
NULL,返回未轉換的列。
一個函數,例如平均值。
purrr 風格的 lambda,例如 ~ mean(.x, na.rm = TRUE)
函數/lambda 列表,例如 list(mean = mean, n_miss = ~ sum(is.na(.x))
此外,我們可以使用pmin
代替case_when
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.