我有一个函数,可以在数据框中创建一个新列,并在每个单元格中重复该数据框的名称:
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())?
谢谢
答案 0 :(得分:3)
您可以防止使用引号对df_x和df_y进行评估:
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
答案 1 :(得分:2)
只要您对names
元素使用正确的list
,此解决方案就可以工作:
df_y <- tibble(x = c(1,2,3,4), y = c('a', 'b', 'c', 'd'))
df_x <- tibble(x = c(5,6,7,8), y = c('e', 'f', 'g', 'h'))
df_list <- list(df_y, df_x) # we create the list
names_list <- c("df_y", "df_x") # we need to name each element
map2(df_list, names_list, function(x,y) {x$name = y # assignment
x})
因此,您只需要创建每个data.frame
的名称的向量即可。然后使用map2
,它将一个函数映射到两个向量(x,y
)
输出:
$`df_y`
# A tibble: 4 x 3
x y name
<dbl> <chr> <chr>
1 1 a df_y
2 2 b df_y
3 3 c df_y
4 4 d df_y
$df_x
# A tibble: 4 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