下面的函式foo將數字列var1重新編碼為一個字串列(1--> "a", 2--> "b"等等)。
我想知道如何將這個函式矢量化,使引數var1變成引數...?
也就是說,在...中提供的所有變數都應該經歷var1在foo中經歷的程序。
一個可能有用的帖子可能是這里。
library(tidyverse)
foo < - function(data, var1。 帽子= FALSE。 反向= FALSE){
讓<- if(caps) base: :LETTERS else base::letters
FUN <- if(reverse) utils。 :tail else utils: :head
data %> % mutate(var1 = factor(FUN(let。 max(var1))[var1]))
}
# 使用例子:
(dat <- data. frame(var1 = c(2。 1, 3, 1, 4。 1), id = 1。 8))
foo(dat, var1, 帽子= T。 反之= T)
uj5u.com熱心網友回復:
我們可以使用across -
foo < - function(data, 帽子= FALSE。 反向 = FALSE, . ...){
vars <- rlang::ensyms(...)
讓<- if(caps) base: :LETTERS else base::letters
FUN <- if(reverse) utils。 :tail else utils: :head
data %>% mutate(across(as。 character(vars)。 ~factor(FUN(let。 max(. ))【. ])))。
}
dat <- data. frame(var1 = c( 2, 1, 3, 1, 4: 1), id = 1。 8)
foo(dat, caps = T。 反之= T, var1)
# var1 id
#1 X 1
#2 W 2 #2 W 2
#3 Y 3
#4 W 4 #4 Y 4
#5 Z 5 #5 Z 5
#6 Y 6 #5 Z 5
#7 X 7
#8 W 8
foo(dat, caps = T。 反轉 = T, var1, id)
# var1 id
#1 X S
#2 W T #2 W T
#3 Y U[/span
#4 W V #3 Y U
#5 Z W[/span
#6 Y X
#7 X Y
#8 W Z
uj5u.com熱心網友回復:
下面的方法應該能達到你所要的效果。它不像我對你問題中的鏈接帖子的回答那樣干凈,但它應該能像預期的那樣作業(現在還更新了適用于所有變數的默認引數):
library(tidyverse)
library(RLANG)
foo <- function(data, ... , caps = FALSE。 reverse = FALSE){
var_ls <- map(ensyms(..., 。 named = TRUE), as. character)
l_varls <- length(var_ls)
if(l_varls ! = length(caps)) {>
caps <- rep(caps, l_varls)
}
if(l_varls ! = length(reverse)) {>
reverse <- rep(reverse, l_varls)
}
讓< - ifelse(caps, list(base: : LETTERS)。 list(base: :letters))
names(let) < - names(var_ls)
FUN < - ifelse(reverse, list(utils。 : tail), list(utils。 :head))
names(FUN) < - names(var_ls)
mutate(data,)
purrr::map_dfc(var_ls,/span>)
~ factor(FUN[. x]](let[. x]]。 max(data[[/span>. x]]))[data[. x]]]))
)
}
# 使用例子:
(dat <- data. frame(var1 = c(2。 1, 3, 1, 4: 1)。 var2 = c(8: 1), id = 1。 8))
#> var1 var2 id
#> 1 2 8 1
#> 2 1 7 2
#> 3 3 6 3
#> 4 1 5 4
#> 5 4 4 5
#> 6 3 3 6
#> 7 2 2 7
#> 8 1 1 8
foo(dat, var1, var2, caps = c(TRUE。 FALSE)。 反向 = c(FALSE。 TRUE))
#> var1 var2 id
#> 1 B z 1
#> 2 A y 2
#> 3 C x 3
#> 4 A w 4
#> 5 D v 5
#> 6 C u 6
#> 7 B t 7
#> 8 A s 8
foo(dat, var1, var2)
#> var1 var2 id
#> 1 b h 1
#> 2 a g 2
#> 3 c f 3
#> 4 a e 4
#> 5 d d 5
#> 6 c c 6
#> 7 b b 7
#> 8 a a 8
foo(dat, var1, var2, caps = TRUE。 反向 = TRUE)。
#> var1 var2 id
#> 1 X Z 1
#> 2 W Y 2
#> 3 Y X 3
#> 4 W W 4
#> 5 Z V 5
#> 6 Y U 6
#> 7 X T 7
#> 8 W S 8
創建于2021-09-18,由reprex包(v0.3.0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/326653.html
標籤:
