使用dplyr,试试这个:
library(lazyeval)
test <- function(df) {
df <- df %>% mutate(ref = expr_label(df))
return(df)
}
test(test_df)
x y ref
1 a `test_df`
2 b `test_df`
3 c `test_df`
4 d `test_df`
5 e `test_df`
或者,这也可以,但不使用dplyr:
test2 <- function(df) {
df$ref <- deparse(substitute(df))
return(df)
}
test2(test_df)
x y ref
1 1 a test_df
2 2 b test_df
3 3 c test_df
4 4 d test_df
5 5 e test_df
由于lapply 的工作方式,要使用数据帧列表和lapply 来实现这项工作比较棘手,但以下解决方法有效:
test_df <- data.frame(x = 1:5, y = c("a","b","c","d","e"))
test_df2 <- data.frame(x = 11:15, y = c("aa","bb","cc","dd","ee"))
在这里我创建了一个命名的数据框列表:
dfs <- setNames(list(test_df, test_df2), c("test_df", "test_df2"))
dfs
$test_df
x y
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
$test_df2
x y
1 11 aa
2 12 bb
3 13 cc
4 14 dd
5 15 ee
现在我更改辅助函数以接受名称作为参数:
test3 <- function(df, nm) {
df$ref <- nm
return(df)
}
这里我只将名称传递给lapply,并从我上面定义的命名列表dfs 中检索每个数据帧。
lapply(names(dfs), function(x) test3(dfs[[x]], x))
[[1]]
x y ref
1 1 a test_df
2 2 b test_df
3 3 c test_df
4 4 d test_df
5 5 e test_df
[[2]]
x y ref
1 11 aa test_df2
2 12 bb test_df2
3 13 cc test_df2
4 14 dd test_df2
5 15 ee test_df2
这不是最优雅的方式,但确实有效。
话虽如此,如果您想将数据帧组合成一个数据帧,那么@markus 使用bind_rows 的建议没有什么可补充的,如
bind_rows(dfs, .id="ref")
ref x y
1 test_df 1 a
2 test_df 2 b
3 test_df 3 c
4 test_df 4 d
5 test_df 5 e
6 test_df2 11 aa
7 test_df2 12 bb
8 test_df2 13 cc
9 test_df2 14 dd
10 test_df2 15 ee