如何在 dplyr 中自动生成表达式对/LHS 和 RHS

问题描述 投票:0回答:2

假设我有一个公式和一些值。我正在尝试执行以下 mutate 语句,其形式为

result{value}=my_formula({value},col1,col2,col3)
:

library(dplyr)

my_formula <- function(value,col1,col2,col3){
  step1 <- value*col1*col2+col3
  step2 <- 50000<step1 & step1<100000
  return(step2)
}

values=c(2,11,14)

mtcars%>%
  mutate(result2=my_formula(2,disp,hp,carb),
         result11=my_formula(11,disp,hp,carb),
         result14=my_formula(14,disp,hp,carb)) %>%
  head

   mpg cyl disp  hp drat    wt  qsec vs am gear carb result2 result11 result14
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   FALSE    FALSE    FALSE
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   FALSE    FALSE    FALSE
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1   FALSE    FALSE    FALSE
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    TRUE    FALSE    FALSE
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   FALSE    FALSE    FALSE
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   FALSE    FALSE    FALSE

是否可以自动执行此 mutate 语句?我在实践中使用 10~1000 个值。我也愿意接受其他方法来生成这些列。

r dplyr
2个回答
1
投票

您可以使用

sapply
迭代
values

> output <- sapply(values, \(x) with(mtcars, my_formula(x, disp, hp, carb)))
> colnames(output) <- paste0("result", values)
> output <-data.frame(mtcars, output)
> head(output)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb result2 result11 result14
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   FALSE    FALSE    FALSE
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   FALSE    FALSE    FALSE
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1   FALSE    FALSE    FALSE
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    TRUE    FALSE    FALSE
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   FALSE    FALSE    FALSE
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   FALSE    FALSE    FALSE

0
投票

与@JilberUrbina的答案类似,但将

lapply(values, ..)
直接放入
mutate
中:

library(dplyr)
values <- c(2,11,14)
values <- setNames(values, paste0("res", values))
mtcars |>
  mutate(data.frame(lapply(values, my_formula, disp, hp, carb))) |>
  head()
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb  res2 res11 res14
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 FALSE FALSE FALSE
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 FALSE FALSE FALSE
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 FALSE FALSE FALSE
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1  TRUE FALSE FALSE
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 FALSE FALSE FALSE
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 FALSE FALSE FALSE

这使用了

mutate
(和
summarize
)的引用不足功能,即如果未命名参数返回
data.frame
,则这些列将被
cbind
' 为原始数据。

© www.soinside.com 2019 - 2024. All rights reserved.