gpt4 book ai didi

R max 函数在 'dplyr' 内使用时返回伪值

转载 作者:行者123 更新时间:2023-12-01 00:09:52 25 4
gpt4 key购买 nike

我将 R 的 max 函数与 summarise 结合使用来自 dplyr 的函数包裹并在 中有一个错字max 函数的参数 na.rm .
我写错了ns.rm = T并且脚本在没有任何警告消息的情况下工作并返回错误的值。
更换 na.rm 时与 ns.rm在一个简单的向量上(在 dplyr 环境之外),函数返回正确的值,如果输入向量包含 NA然后它返回一个 NA值而没有任何关于使用错误参数的警告。

下面是一个例子:

if(!require('magrittr')) install.packges('magrittr')
if(!require('dplyr')) install.packges('dplyr')

tab <- data.frame("grp1" = sort(rep(1:4, 5)),
"grp2" = rep(c(1:2), 10),
"val" = rnorm(20))


tab

grp1 grp2 val
1 1 1 0.03536351
2 1 2 1.04237251
3 1 1 0.82735937
4 1 2 0.29040424
5 1 1 0.30194926
6 2 2 -0.96649026
7 2 1 -0.97388257
8 2 2 -0.13111541
9 2 1 -0.48337864
10 2 2 -0.73471857
11 3 1 -0.88536656
12 3 2 -1.30442575
13 3 1 1.18816751
14 3 2 -0.90334058
15 3 1 -0.53102641
16 4 2 -0.69266762
17 4 1 -0.64776312
18 4 2 0.01354644
19 4 1 0.78058285
20 4 2 -0.06647959
>
### Using max function within dplyr
## Right way

tab %>%
group_by(grp1, grp2) %>%
summarise("max_val" = max(val, na.rm = T))

# A tibble: 8 x 3
# Groups: grp1 [4]
grp1 grp2 max_val
<int> <int> <dbl>
1 1 1 0.827
2 1 2 1.04
3 2 1 -0.483
4 2 2 -0.131
5 3 1 1.19
6 3 2 -0.903
7 4 1 0.781
8 4 2 0.0135
## with a typo in na.rm argument

tab %>%
group_by(grp1, grp2) %>%
summarise("max_val" = max(val, ns.rm = T))



# A tibble: 8 x 3
# Groups: grp1 [4]
grp1 grp2 max_val
<int> <int> <dbl>
1 1 1 1
2 1 2 1.04
3 2 1 1
4 2 2 1
5 3 1 1.19
6 3 2 1
7 4 1 1
8 4 2 1
### Using max function on a vector

max(c(1, 2, 3), ns.rm = T)
[1] 3
max(c(1, 2, 3), ns.rm = T)
[1] 3
max(c(1, 2, 3), na.rm = T)
[1] 3
max(c(1, 2, 3, NA), ns.rm = T)
[1] NA
max(c(1, 2, 3, NA), na.rm = T)
[1] 3

有人知道 ns.rm 是否是任何 R 函数的合法输入参数吗?
如果没有,为什么没有警告使用的参数使用不当?

最佳答案

不,ns.rm不是合法的输入参数,但这里发生的是 ns.rm = T被认为是在 max 中传递的向量中的新输入哪里T被认为是 1。

max(c(1, 2, 3), ns.rm = T)
#[1] 3

实际上被解释为
max(c(1, 2, 3), 1)
#[1] 3


max(c(0.1, 0.2, 0.33), ns.rm = T)
#[1] 1

被解释为
max(c(0.1, 0.2, 0.33), 1)


max(c(1, 2, 3, NA), ns.rm = T)
#[1] NA

实际上是
max(c(1, 2, 3, NA), 1)
#[1] NA

同样,对于数据框
set.seed(123)
tab <- data.frame(grp1 = sort(rep(1:4, 5)),
grp2 = rep(c(1:2), 10),
val = rnorm(20))

通过使用正确的方法,我们得到的数字为
library(dplyr)
tab %>% group_by(grp1, grp2) %>% summarise(max_val = max(val, na.rm = T))

# grp1 grp2 max_val
# <int> <int> <dbl>
#1 1 1 1.56
#2 1 2 0.0705
#3 2 1 0.461
#4 2 2 1.72
#5 3 1 1.22
#6 3 2 0.360
#7 4 1 0.701
#8 4 2 1.79

现在如果我们使用 ns.rm = T
tab %>%  group_by(grp1, grp2) %>% summarise(max_val = max(val, ns.rm = T))

# grp1 grp2 max_val
# <int> <int> <dbl>
#1 1 1 1.56
#2 1 2 1
#3 2 1 1
#4 2 2 1.72
#5 3 1 1.22
#6 3 2 1
#7 4 1 1
#8 4 2 1.79

注意哪里 max_val在上述组中小于 1 现在在使用 ns.rm 时替换为 1自 T被解释为 1。

另请注意,这不仅限于 ns.rm只是,您可以在此处使用任何字符。
max(c(0.1, 0.2, 0.33), a = T)
#[1] 1

关于R max 函数在 'dplyr' 内使用时返回伪值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59551170/

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