[英]How can I conditionally "mutate" a variable inside a dplyr pipe
正如標題所說,我正在嘗試有條件地向我的 dplyr pipe 添加一個變異步驟。 但是我遇到了錯誤。 有沒有一個整潔的解決方案? 這是一個簡單的例子......
max.mpg <- 50
mtcars %>%
{
if(!!max.mpg > 10) mutate(foo = 1) else .
}
但是上面會產生以下錯誤:
no applicable method for 'mutate' applied to an object of class "c('double', 'numeric')"
我想要做的是向 mtcars 數據框添加一個新變量——但僅限於給定條件。 如果條件是FALSE
,那么我只想返回原始數據幀。
有趣的是,如果我將上述條件更改為FALSE
(例如通過編寫if(.!max.mpg > 60)
),那么腳本運行良好。 因此,問題似乎確實存在於 mutate 動詞中。
最后,如果它對解決方案有很大影響,我將上述內容嵌入到自定義 function 中。 但我想如果我能在上面得到正確的簡單腳本,我可以把 rest 工作出來。
有什么建議么?
你不需要 tidyeval
library(dplyr)
max.mpg <- 50
mtcars %>% {if(max.mpg > 10) mutate(., foo=1) else .}
#> mpg cyl disp hp drat wt qsec vs am gear carb foo
#> Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1
#> Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 1
#> Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 1
#> Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 1
#> Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 1
...
mtcars %>% {if(max.mpg > 60) mutate(., foo=1) else .}
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
#> Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
#> Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#> Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
...
似乎您要評估的內容與數據集沒有任何關系,因為您正在定義 max.mpg 然后將其與常數進行比較。 我假設你想要做的是當 mpg 大於 max.mpg 時標記,在這種情況下這應該有效
library (dplyr)
max.mpg <- 50
mtcars %>% mutate(foo=if_else(mpg>max.mpg, true = 1, false = 0))
值為 50 時,所有行的評估結果都相同,如果將其更改為 mpg 范圍內的內容,則可以看到它有條件地評估。
max.mpg <- 20
mtcars %>% mutate(foo=if_else(mpg>max.mpg, true = 1, false = 0))
您可以使用 dplyr 中的 case_when() function。
圖書館(dplyr)
mtcar %>% mutate(foo = case_when(max.mpg > 10 ~ 1, TRUE~.)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.