gpt4 book ai didi

r - 如何将这个 sapply 用例转换为 dplyr?

转载 作者:行者123 更新时间:2023-12-01 21:54:34 25 4
gpt4 key购买 nike

在使用 predict.knn3 时,我遇到了一个有趣的数据处理用例。我不知道我可以使用参数 type="class" 调用 predict 来获得预测级别,这正是我需要的。因此,我想出了一个有点复杂的解决方案,从每个 predict() 的结果行中选择具有最大概率的级别。问题是由于 names 函数不能以矩阵的“矢量化”形式工作,而只能使用向量。

为了说明发现type="class" 参数之前和之后的用例:

rm(list = ls())
library(caret)
library(tidyverse)
library(dslabs)

data("tissue_gene_expression")
x <- tissue_gene_expression$x
y <- tissue_gene_expression$y

set.seed(1)
test_index <- createDataPartition(y, times = 1, p = 0.5, list = FALSE)
test_x <- x[test_index,]
test_y <- y[test_index]
train_x <- x[-test_index,]
train_y <- y[-test_index]

# fit the model, predict without type="class" and use sapply to build the y_hat levels
fit <- knn3(train_x, train_y, k = 1)
pred <- predict(fit, test_x)
y_hat <- sapply(1:nrow(pred), function(i) as.factor(names(pred[i,which.max(pred[i,])])))

# compare it to the solution using predict with type="class"
identical(y_hat, as.factor(predict(fit, test_x, type="class")))
[1] TRUE

为了说明这个问题,我可以执行以下操作,看到 names 函数对命名数字元素的向量进行操作会产生所需的结果,而矩阵将失败并输出 NULL:

names(pred[1, which.max(pred[1,])])
[1] "cerebellum"
names(pred[1:2, which.max(pred[1:2,])])
NULL

假设在 predict.knn3 函数中不知道这个方便的 type="class";有没有更简单的方法使用 tidyverse 和 dplyr 来替换这个 sapply ?或者任何其他更简单的方法来实现这个用例?

y_hat <- sapply(1:nrow(pred), function(i) as.factor(names(pred[i, which.max(pred[i,])])))

我正在寻找类似以下的东西,但它不起作用:

as_tibble(predict(fit, test_x)) %>% mutate(y_hat=names(which.max(.[row_number(),])))

最佳答案

我发现使用 dplyr 对行进行操作可能有点困惑。这应该工作。猜测一下,这不是计算效率最高的。

solution <- as_tibble(predict(fit, test_x)) %>%
rowwise() %>%
do(as.data.frame(.) %>%
mutate(., y_hat = names(.)[which.max(select(., everything()))])
)

solution %>%
slice(18:22)

# A tibble: 5 x 8
cerebellum colon endometrium hippocampus kidney liver placenta y_hat
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 1 0 0 0 0 0 0 cerebellum
2 1 0 0 0 0 0 0 cerebellum
3 0 1 0 0 0 0 0 colon
4 0 1 0 0 0 0 0 colon
5 0 1 0 0 0 0 0 colon

关于r - 如何将这个 sapply 用例转换为 dplyr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680388/

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