gpt4 book ai didi

r - dplyr::mutate 给出 x/y = NA,summary 给出 x/y = 实数

转载 作者:行者123 更新时间:2023-12-04 20:37:18 26 4
gpt4 key购买 nike

我正在验证一个函数来计算我实验室中某个标准的通过率。这背后的数学原理非常简单:给定一些通过或失败的测试,通过的百分比是多少。

数据将作为一列值提供,即 P1 (第一次测试通过),F1 (第一次测试失败),P2F2 (分别在第二次测试中通过或失败)。我写了函数passRate下面有助于计算整体(第一次和第二次尝试)以及第一次测试和第二次测试的通过率。

为验证设置参数的质量专家给了我一个通过和失败计数的列表,我正在使用 test_vector 将其转换为向量。下面的功能。

一切看起来都很棒,直到我到达 Pass 的第三排数据框,其中包含来自我的质量专家的通过/失败计数。它没有返回 100% 的第二次测试通过率,而是返回 NA...但仅当我使用 mutate

library(dplyr)

Pass <- structure(list(P1 = c(2L, 0L, 10L),
F1 = c(0L, 2L, 0L),
P2 = c(0L, 3L, 2L),
F2 = c(0L, 2L, 0L),
id = 1:3),
.Names = c("P1", "F1", "P2", "F2", "id"),
class = c("tbl_df", "data.frame"),
row.names = c(NA, -3L))

所以这类似于我对 mutate 所做的事情.
Pass %>%
group_by(id) %>%
mutate(pass_rate = (P1 + P2) / (P1 + P2 + F1 + F2) * 100,
pass_rate1 = P1 / (P1 + F1) * 100,
pass_rate2 = P2 / (P2 + F2) * 100)

Source: local data frame [3 x 8]
Groups: id [3]

P1 F1 P2 F2 id pass_rate pass_rate1 pass_rate2
(int) (int) (int) (int) (int) (dbl) (dbl) (dbl)
1 2 0 0 0 1 100.00000 100 NA
2 0 2 3 2 2 42.85714 0 60
3 10 0 3 1 3 100.00000 100 NA

我用时比较 summarise
Pass %>%
group_by(id) %>%
summarise(pass_rate = (P1 + P2) / (P1 + P2 + F1 + F2) * 100,
pass_rate1 = P1 / (P1 + F1) * 100,
pass_rate2 = P2 / (P2 + F2) * 100)

Source: local data frame [3 x 4]

id pass_rate pass_rate1 pass_rate2
(int) (dbl) (dbl) (dbl)
1 1 100.00000 100 NA
2 2 42.85714 0 60
3 3 100.00000 100 100

我原以为这些会返回相同的结果。我的猜测是 mutate某处有问题,因为它假设 n每组行应该映射到 n结果中的行(是否在计算 n 时感到困惑?),而 summarise知道无论它从多少行开始,它都会以 1 行结束。

有没有人对这种行为背后的机制有任何想法?

最佳答案

在我看来,dplyr 之间有点干扰和 plyr .我在另一个不平衡的数据集上遇到了同样的问题(所以分组是必要的),正好在 中。第三个 组变异变量错误地为 NA!然后我在家里复制了你的例子。首先,之后

library("dplyr", lib.loc="~/R/x86_64-pc-linux-gnu-library/3.2")

我得到了你的结果。然后我执行了我自己的脚本,其中包 plyr已加载。警告后不要加载 plyr之后 dplyr ,我的 NA 第三个 组不见了,你的例子也计算正确!这是我所做的(我又添加了一行以查看 NA 是否仍留在第三组中):
> Pass <- structure(list(P1 = c(2L, 0L, 10L,8L), 
+ F1 = c(0L, 2L, 0L, 4L),
+ P2 = c(0L, 3L, 2L, 2L),
+ F2 = c(0L, 2L, 0L, 1L),
+ id = 1:4),
+ .Names = c("P1", "F1", "P2", "F2", "id"),
+ class = c("tbl_df", "data.frame"),
+ row.names = c(NA, -4L))
> Pass %>%
+ group_by(id) %>%
+ mutate(pass_rate = (P1 + P2) / (P1 + P2 + F1 + F2) * 100,
+ pass_rate1 = P1 / (P1 + F1) * 100,
+ pass_rate2 = P2 / (P2 + F2) * 100)
Source: local data frame [4 x 8]
Groups: id [4]

P1 F1 P2 F2 id pass_rate pass_rate1 pass_rate2
(int) (int) (int) (int) (int) (dbl) (dbl) (dbl)
1 2 0 0 0 1 100.00000 100.00000 NA
2 0 2 3 2 2 42.85714 0.00000 60.00000
3 10 0 2 0 3 100.00000 100.00000 NA
4 8 4 2 1 4 66.66667 66.66667 66.66667

然后我做了:
> library("plyr", lib.loc="~/R/x86_64-pc-linux-gnu-library/3.2")
> Pass %>%
+ group_by(id) %>%
+ mutate(pass_rate = (P1 + P2) / (P1 + P2 + F1 + F2) * 100,
+ pass_rate1 = P1 / (P1 + F1) * 100,
+ pass_rate2 = P2 / (P2 + F2) * 100)
Source: local data frame [4 x 8]
Groups: id [4]

P1 F1 P2 F2 id pass_rate pass_rate1 pass_rate2
(int) (int) (int) (int) (int) (dbl) (dbl) (dbl)
1 2 0 0 0 1 100.00000 100.00000 NaN
2 0 2 3 2 2 42.85714 0.00000 60.00000
3 10 0 2 0 3 100.00000 100.00000 100.00000
4 8 4 2 1 4 66.66667 66.66667 66.66667

我知道这不是一个令人满意的答案,因为 plyr应该 不是 后加载 dplyr ,但也许它可以帮助那些需要 group_by(id) 的人.或使用 plyr::mutate() .然后你可以加载 dplyr之后 plyr :
 > Pass %>%
+ group_by(id) %>%
+ plyr::mutate(pass_rate = (P1 + P2) / (P1 + P2 + F1 + F2) * 100,
+ pass_rate1 = P1 / (P1 + F1) * 100,
+ pass_rate2 = P2 / (P2 + F2) * 100)
Source: local data frame [4 x 8]
Groups: id [4]

P1 F1 P2 F2 id pass_rate pass_rate1 pass_rate2
(int) (int) (int) (int) (int) (dbl) (dbl) (dbl)
1 2 0 0 0 1 100.00000 100.00000 NaN
2 0 2 3 2 2 42.85714 0.00000 60.00000
3 10 0 2 0 3 100.00000 100.00000 100.00000
4 8 4 2 1 4 66.66667 66.66667 66.66667

关于r - dplyr::mutate 给出 x/y = NA,summary 给出 x/y = 实数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33107956/

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