簡體   English   中英

將 case_when 與 dplyr 一起使用

[英]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是 cross 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 ~ .)))

根據?acrossfns的參數可以是

應用於每個選定列的函數。 可能的值為:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM