【发布时间】:2021-08-13 14:36:12
【问题描述】:
我的函数parse_columns 有四个参数:
- 一个data.frame\tibble:
df - 代表 tibble 中列子集的字符向量:
vars - 一个模式:
pattern - 要在同一个 tibble 中创建的新输出列的名称:
out_name
它计算输入 tibble (df) 中参数 2 (vars) 中参数 3 (pattern) 的实例,并在 tibble 中创建一个新列 (out_name)。
功能:
library(dplyr)
library(stringr)
parse_columns <- function(df, vars, pattern, out_name){
df <- df %>%
rowwise() %>%
mutate(x = sum(across(all_of(vars), .fns = ~ as.numeric(str_detect(., pattern))
)
)
)
names(df)[names(df) == "x"] <- out_name
return(df)
}
我在(至少)四次调用该函数:
tidy <- parse_columns(tidy, additional_vars, "w", "available_w")
tidy <- parse_columns(tidy, additional_vars, "x", "available_x")
tidy <- parse_columns(tidy, additional_vars, "y", "available_y")
tidy <- parse_columns(tidy, additional_vars, "z", "available_z")
我的问题是,我如何使用purrr(也许使用purrr:pmap())重构以上4行代码?
编辑 #1: 感谢@NelsonGon 对使用 map2() 的评论。
我尝试了以下方法:
library(stringi)
arg1 <- c("w", "x", "y", "z")
arg2 <- "available_" %s+% arg1
tidy %>% map2(arg1, arg2, .f = parse_columns(.,
vars = additional_vars,
pattern = arg1,
out_name = arg2
)
但是得到这个错误(在函数中):
Error: Can't convert a `rowwise_df/tbl_df/tbl/data.frame` object to function
Run `rlang::last_error()` to see where the error occurred.
In addition: Warning message:
In names(df)[names(df) == "x"] <- out_name :
number of items to replace is not a multiple of replacement length
编辑#2:
@RonakShah,整洁的 df 包含 PII,但要点是将 pattern 的所有实例与选定的 vars (按行)相加,输出与 out_name 相同的小标题作为新变量。所以使用以下内容:
tidy <- tibble(
a = str_to_lower(LETTERS),
b = str_to_lower(LETTERS),
c = str_to_lower(LETTERS),
d = rnorm(26)
)
additional_vars <- c("a", "b", "c")
tidy <- parse_columns(tidy, additional_vars, "w", "available_w")
tidy <- parse_columns(tidy, additional_vars, "x", "available_x")
tidy <- parse_columns(tidy, additional_vars, "y", "available_y")
tidy <- parse_columns(tidy, additional_vars, "z", "available_z")
print(tail(tidy))
# A tibble: 6 x 8
# Rowwise:
a b c d available_w available_x available_y available_z
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 u u u 0.692 0 0 0 0
2 v v v 1.05 0 0 0 0
3 w w w 0.544 3 0 0 0
4 x x x -1.93 0 3 0 0
5 y y y 0.943 0 0 3 0
6 z z z 0.992 0 0 0 3
【问题讨论】:
-
map2因为您只更改了两个变量或基数Map? -
感谢@NelsonGon,我已经相应地编辑了我的问题。
-
@RonakShah,我已编辑问题以提供 tidy 的合成版本。
标签: r refactoring purrr