gpt4 book ai didi

r - 根据与 dplyr::select 兼容的类/类型选择列

转载 作者:行者123 更新时间:2023-12-03 18:22:20 25 4
gpt4 key购买 nike

实际问题

我如何定义一个选择帮助器,它根据它们的类/类型选择列并且也与 dplyr 兼容的架构?

尽职调查

我看过 https://cran.r-project.org/web/packages/dplyr/vignettes/introduction.html以及 dplyr::select_helpers 的帮助但没有找到任何可以让我根据类/类型进行选择的东西

例子

引入一些变化的 WRT 类/类型:

dat <- mtcars
dat <- dat %>% mutate(
mpg = as.character(mpg),
wt = as.factor(wt),
vs = as.character(vs)
)

简而言之,我想让它成为 R 中所有可能的类/类型(以及它们的组合)的通用方法:
dat[ , sapply(dat, is.character)]
# mpg wt vs
# 1 21 2.62 0
# 2 21 2.875 0
# 3 22.8 2.32 1
# 4 21.4 3.215 1

基于 Subset variables in data frame based on column type我可以这样做:
select_on_class <- function(.data, cls = "numeric") {
dat[ , names(.data)[sapply(.data,
function(vec, clss) class(vec) %in% clss, clss = cls)]]
}
dat %>% select_on_class(c("character", "factor"))
# mpg wt vs
# 1 21 2.62 0
# 2 21 2.875 0
# 3 22.8 2.32 1
# 4 21.4 3.215 1

但我希望能够在对 dplyr::select 的调用中使用它,所以我试过这个:
has_class <- function(.data, cls = "numeric") {
nms <- names(.data)[sapply(.data,
function(vec, clss) class(vec) %in% clss, clss = cls)]
sapply(nms, as.name)
}
dat %>% has_class(c("character", "factor"))
# $mpg
# mpg
#
# $wt
# wt
#
# $vs
# vs

问题是 sapply(nms, as.name)返回 list这与 select 的内部结构不太协调(我还不完全明白,顺便说一句):
dat %>% select(has_class(c("character", "factor")))
# Error: All select() inputs must resolve to integer column positions.
# The following do not:
# * has_class("character")

dat %>% select_(has_class(c("character", "factor")))
# Error in UseMethod("as.lazy") :
# no applicable method for 'as.lazy' applied to an object of class "list"

编辑

基于使用 select_if 的答案我试图概括并陷入困境:
has_class <- function(.data, cls) {
sapply(.data, function(vec, clss) class(vec) %in% clss, clss = cls)
}
dat %>% has_class(c("character", "factor"))
# mpg cyl disp hp drat wt qsec vs am gear carb
# TRUE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE
dat %>% select_if(has_class, c("character", "factor"))
# Error in vapply(tbl, p, logical(1), ...) : values must be length 1,
# but FUN(X[[1]]) result is length 32

AFAIU, .predicate函数只需要返回一个逻辑向量( has_class 这样做),我可以将额外的参数传递给 .predicate功能通过 ... (我做了)。那么我哪里还出错了?

最佳答案

我想 dplyr::select_if()可能是您正在寻找的。例如

dat <- mtcars %>% 
mutate(mpg = as.character(mpg),
wt = as.character(wt),
vs = as.character(vs)
) %>%
select_if(is.character)

关于r - 根据与 dplyr::select 兼容的类/类型选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951377/

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