簡體   English   中英

mutate_if - 警告信息

[英]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.numericmean 由於您的第一列( 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是預期的,那么通常應該返回NANaN ,而不是數字......即使你可能不認為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.

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