% mutate_if(~is.n-6ren">
gpt4 book ai didi

r - mutate_if - 警告消息

转载 作者:行者123 更新时间:2023-12-02 09:04:19 26 4
gpt4 key购买 nike

大家好,

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,那么通常应该返回 NA code> 或 NaN,不是数字...即使您可能不认为 Inf 是一个真正可用的数字。(2) 它正在解决症状,而不是问题。问题在于矢量化逻辑表达式中不存在短路。)

关于r - mutate_if - 警告消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60246025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com