r - 将一个函数映射到多个数据帧
问题描述
我有一个函数可以在数据框中创建一个新列,在每个单元格中重复数据框的名称:
add_column_with_name <- function(x) {
x$name <- deparse(substitute(x))
return(x)
它单独工作:
df_y <- tibble(x = c(1,2,3,4), y = c('a', 'b', 'c', 'd'))
df_y <- add_columns_with_name(df_y)
df_y
# A tibble: 4 x 3
x y name1
<dbl> <chr> <chr>
1 1 a df_y
2 2 b df_y
3 3 c df_y
4 4 d df_y
但是当我将函数作为参数传递给 map 以将其应用于数据框列表时,对象名称不会映射:
df_x <- tibble(x = c(5,6,7,8), y = c('e', 'f', 'g', 'h'))
df_vector <- c(df_x, df_y)
result <- map_df(df_vector, add_column_with_name)
result
# A tibble: 8 x 3
x y name1
<dbl> <chr> <chr>
1 5 e .x[[i]]
2 6 f .x[[i]]
3 7 g .x[[i]]
4 8 h .x[[i]]
5 1 a .x[[i]]
6 2 b .x[[i]]
7 3 c .x[[i]]
8 4 d .x[[i]]
我还尝试了一种更优雅的方法:
result <- map_df(df_vector, ~ mutate(., name = deparse(substitute(.))))
result
# A tibble: 8 x 3
x y name
<dbl> <chr> <chr>
1 5 e .
2 6 f .
3 7 g .
4 8 h .
5 1 a .
6 2 b .
7 3 c .
8 4 d .
在我写这篇文章的时间里,我本可以对这些值进行硬编码,但我认为我错过了一些重要的东西!错误是否可能在于使用 deparse(substitute())?
谢谢
解决方案
您可以防止 df_x 和 df_y 使用 quote 进行评估:
purrr::map_df(list(quote(df_x),quote(df_y))
, function(x) {y <- eval(x); y$name <- as.character(x); y})
## A tibble: 8 x 3
# x y name
# <dbl> <chr> <chr>
#1 5 e df_x
#2 6 f df_x
#3 7 g df_x
#4 8 h df_x
#5 1 a df_y
#6 2 b df_y
#7 3 c df_y
#8 4 d df_y
推荐阅读
- json - 在 Angular 中难以实现分页功能
- css - Angular cdk拖放:拖放到其他容器后保持元素样式
- python - 如何在 Pytest 的收集时添加自定义 XML 属性?
- mysql - Delete rows to keep only top values in a sql table
- react-native - onEndReached 在数据加载完成之前触发
- ios - 在不覆盖自定义更改的情况下更新 GitHub iOS SDK
- unity3d - 如何让鼠标点击对象,而不是当它在被点击的按钮后面时?
- gatsby - gatsby-starter-default 启动器中的 Image 组件的用途是什么?
- angular - 在同一个 NgModule 中暴露一个组件和 Mock
- c# - TcpListener 没有被执行