gpt4 book ai didi

r - dplyr 变异/嬗变 : drop only the columns used in the formula

转载 作者:行者123 更新时间:2023-12-02 10:38:15 25 4
gpt4 key购买 nike

假设我的数据框有 A、B、C、D、E 列。

我想生成一个包含 A、B、C、X 列的数据框,其中 X = D * E。

显然我可以使用%>% mutate(X = D * E) %>% select (-D, -E),但是对于更复杂的情况,有没有办法做到这一点在一个命令中?与 transmute() 类似,但仅丢弃提到的列。

愚蠢,但我一直希望能有这样的简洁。

最佳答案

如果您希望组合这两个操作,可以在 mutate 中使用 NULL 来指定应删除哪些列:

df %>% mutate( X=D*E, D=NULL, E=NULL )

不幸的是,您仍然必须提及每个变量两次,所以也许它只是稍微简洁一些。

更新:所以,我真的很喜欢这个问题,因为它本质上要求一个具有 mutatetransmute 的一些功能的更改器(mutator)。这样的更改器(mutator)需要解析提供的表达式来识别计算正在使用哪些符号,然后从结果中删除这些符号。

为了实现这样的突变器,我们需要一些工具。首先,我们定义一个函数来检索表达式的 abstract syntax tree (AST) .

library( tidyverse )

## Recursively constructs the abstract syntax tree (AST) of the provided expression
getAST <- function( ee ) { as.list(ee) %>% map_if(is.call, getAST) }

以下是 getAST 的实际应用示例:

z <- quote( a*log10(x)+b )   ## Captures the expression a*log10(x)+b
getAST( z ) %>% str
# List of 3
# $ : symbol +
# $ :List of 3
# ..$ : symbol *
# ..$ : symbol a
# ..$ :List of 2
# .. ..$ : symbol log10
# .. ..$ : symbol x
# $ : symbol b

检索表达式使用的符号列表只需要展平和解析该树即可。

## Retrieves all symbols (as strings) used in a given expression
getSyms <- function( ee ) { getAST(ee) %>% unlist %>% map_chr(deparse) }
getSyms(z)
# [1] "+" "*" "a" "log10" "x" "b"

我们现在准备好实现新的更改器(mutator),用于计算新列(类似于mutate)并删除计算中使用的变量(类似于transmute):

## A new mutator that removes all variables used by the computations
transmutate <- function( .data, ... )
{
## Capture the provided expressions and retrieve their symbols
vSyms <- enquos(...) %>% map( ~getSyms(get_expr(.x)) )

## Identify symbols that are in common with the provided dataset
## These columns are to be removed
vToRemove <- intersect( colnames(.data), unlist(vSyms) )

## Pass on the expressions to mutate to do the work
## Remove the identified columns from the result
mutate( .data, ... ) %>% select( -one_of(vToRemove) )
}

让我们来尝试一下这个新函数:

## Expected output should include new columns X, Y
## removed columns vs, drat, wt, mpg, and cyl
## and everything else the same
## (Note that in the classical tidyverse spirit, rownames are not preserved)
transmutate( mtcars, X = ifelse( vs, drat, wt ), Y = mpg*cyl )
# disp hp qsec am gear carb X Y
# 1 160.0 110 16.46 1 4 4 2.620 126.0
# 2 160.0 110 17.02 1 4 4 2.875 126.0
# 3 108.0 93 18.61 1 4 1 3.850 91.2
# 4 258.0 110 19.44 0 3 1 3.080 128.4
# ...

关于r - dplyr 变异/嬗变 : drop only the columns used in the formula,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51428156/

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