Используя 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