[英]mutate_if - warning message
大家好,
library(dplyr)
library(tibble)
mtcars %>%
rownames_to_column("modelle") %>%
mutate_if(~is.numeric(.x) & mean(.x) > 50, ~(.x / 1000))
Warning message:
In mean.default(.x) : argument is not numeric or logical: returning NA
這個錯誤似乎是因為字符向量。 它有效,但它仍然非常丑陋。 我做錯了什么,在這種情況下可以做得更好嗎?
謝謝!
R 不會短路矢量化&
,因此它在所有列上同時運行is.numeric
和mean
。 由於您的第一列( modelle
)顯然是character
,因此它失敗了。
但是,您實際上不需要對其進行矢量化。 如果您從矢量化&
更改為二進制&&
,R 會將其短路並獲得所需的行為。
mtcars %>%
rownames_to_column("modelle") %>%
mutate_if(~is.numeric(.x) && mean(.x) > 50, ~(.x / 1000)) %>%
head()
# modelle mpg cyl disp hp drat wt qsec vs am gear carb
# 1 Mazda RX4 21.0 6 0.160 0.110 3.90 2.620 16.46 0 1 4 4
# 2 Mazda RX4 Wag 21.0 6 0.160 0.110 3.90 2.875 17.02 0 1 4 4
# 3 Datsun 710 22.8 4 0.108 0.093 3.85 2.320 18.61 1 1 4 1
# 4 Hornet 4 Drive 21.4 6 0.258 0.110 3.08 3.215 19.44 1 0 3 1
# 5 Hornet Sportabout 18.7 8 0.360 0.175 3.15 3.440 17.02 0 0 3 2
# 6 Valiant 18.1 6 0.225 0.105 2.76 3.460 20.22 1 0 3 1
進一步證明&
不是短路。
mymean <- function(x, ...) {
if (is.character(x)) {
message("character?")
return(Inf) # this is certainly not the right thing to do in general ...
} else mean(x, ...)
}
mtcars %>%
rownames_to_column("modelle") %>%
mutate_if(~is.numeric(.x) & mymean(.x) > 50, ~(.x / 1000)) %>%
head()
# character?
# modelle mpg cyl disp hp drat wt qsec vs am gear carb
# 1 Mazda RX4 21.0 6 0.160 0.110 3.90 2.620 16.46 0 1 4 4
# 2 Mazda RX4 Wag 21.0 6 0.160 0.110 3.90 2.875 17.02 0 1 4 4
# 3 Datsun 710 22.8 4 0.108 0.093 3.85 2.320 18.61 1 1 4 1
# 4 Hornet 4 Drive 21.4 6 0.258 0.110 3.08 3.215 19.44 1 0 3 1
# 5 Hornet Sportabout 18.7 8 0.360 0.175 3.15 3.440 17.02 0 0 3 2
# 6 Valiant 18.1 6 0.225 0.105 2.76 3.460 20.22 1 0 3 1
如果短路發生的地點,然后mymean
永遠不會得到該消息。 (我不認為這里mymean
是一個可行的替代品,原因如下:(1) Inf
的使用僅僅是為了確保調用mean
之外的條件有效,但是如果發生錯誤/警告並且numeric
是預期的,那么通常應該返回NA
或NaN
,而不是數字......即使你可能不認為Inf
是一個真正可用的數字。(2)它正在解決一個症狀,而不是問題。問題是沒有矢量化邏輯表達式中的短路。)
您應該使用“&&”而不是“&”。 第一個用於標量,第二個用於向量。 在你的情況下,平均值是一個標量。
library(dplyr)
library(tibble)
mtcars %>%
rownames_to_column("modelle") %>%
mutate_if(~is.numeric(.x) && mean(.x) > 50, ~(.x / 1000))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.