我的R函数在通过map()传递时接受单个列名,但不接受列名列表

hmae6n7t  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(144)

经过几个月的使用这个论坛,我终于有一个问题的社区,我似乎不能找到充分解决其他地方。
在R中,我创建了一个函数,当通过map()传递时,它接受单个列名,但不接受列名列表。问题似乎是求值问题,所以我尝试了quo()和enquo(),但由于我不太理解它们是如何工作的,我需要一些帮助。
我已经尝试过迭代不同版本的函数(根据错误信息注解掉违规的行),但这只会移动问题,而不会解决它。

# Load:
library(tidyverse)

# Create df:
set.seed(12)
df <- tibble(col1 = sample(c("a", "b", "c"), 10, replace = TRUE),
             col2 = sample(1:4, 10, replace = TRUE),
             col3 = sample(1:4, 10, replace = TRUE))

# My function:
my_function <- function(col_name) {
  
  df <- df %>%
    filter({{ col_name }} != 1) %>%
    group_by(fct_relevel(factor(col1), "c", "b", "a")) %>%
    mutate(col4 = 5 - {{ col_name }}) %>%
    summarise("Score" = mean(col4)) %>%
    rename("Levels" =
             `fct_relevel(factor(col1), "c", "b", "a")`)
  
  return(df)
  
}

# List of col_names to pass to function:
col_list <- list(df$col2, df$col3)

# Attempt function in map() using list of col_names:
map(col_list, my_function)

# Gives error message:
# Error in `mutate()`:
# ! Problem while computing `col4 = 5 - c(1L, 2L, 1L, 2L,
#                                        4L, 2L, 2L, 3L, 4L, 1L)`.
# ✖ `col4` must be size 2 or 1, not 10.
# ℹ The error occurred in group 1: fct_relevel(factor(col1), "c",
#                                             "b", "a") = c.
htzpubme

htzpubme1#

您遇到的一个问题是,col_list实际上不是列名列表,而是来自这些列的实际数据。
我不太确定你希望得到什么样的输出,但我猜应该是my_function的结果的full_join

new_f <- function(...){
    df %>% 
        mutate(across(-col1, ~if_else(.x == 1L, NA, .x))) %>% 
        group_by("Levels" = fct_relevel(factor(col1), "c", "b", "a")) %>% 
        select(Levels, ...) %>% 
        summarize(across(everything(), ~ mean(5- .x, na.rm = TRUE)))
}

new_f(col2, col3)
new_f(col2)
new_f(col3)

现在,我意识到,也许我没有理解你的真正意图。例如,也许你试图理解如何使用purrr::map。如果是这样,请评论或更新你的问题。
在任何情况下,您都应该查看Programming with dplyr

相关问题