使用函数的输入作为r中的变量名



我在R中有一个简单的函数来修改数据帧

monthly_fun <- function(x){
x  %>% 
mutate(obstime = convert_dates(obstime)) %>% 
select(obstime, x = obsvalue)
}

当将函数应用于数据框df,即monthly_fun(df)时,我希望dfobsvalue的名称。在我目前的代码中,名称显然是"x",我如何修改select中的部分,以获得所提供的数据框的名称作为变量名称?

Thanks a lot

编辑:我想使用

将此函数应用于多个数据帧
result <- list( df1, df2, df3) %>%
lapply( monthly_fun )

您可以通过deparse(substitute(x))提取输入的名称,并在mutate()中使用!!y := obsvalue

monthly_fun <- function(x) {
y <- deparse(substitute(x))
x  %>% 
mutate(obstime = convert_dates(obstime),
!!y := obsvalue) %>% 
select(obstime, y)
}

一个简化的例子:

fun <- function(x) {
y <- deparse(substitute(x))
x  %>% 
mutate(!!y := 1) %>% 
select(y)
}
fun(df)
#       df
#  1     1
#  2     1
#  3     1
#  4     1
#  5     1

更新如果您希望将其应用于存储在列表中的多个数据帧,则应该设计一个2参数函数,一个参数用于数据,另一个参数用于新列名。然后使用Map()将此函数应用于每对数据和名称。

fun <- function(x, y) {
x %>% 
mutate(!!y := 1) %>% 
select(y)
}
Map(fun, list(df1, df2), c("name1", "name2"))
# [[1]]
#     name1
# 1       1
# 2       1
# 3       1
# 4       1
# 5       1
#
# [[2]]
#     name2
# 1       1
# 2       1
# 3       1
# 4       1
# 5       1

如果您熟悉purrr,则可以用map2()imap()替换Map的使用。(注意两个函数输入的差异)

library(purrr)
# (1) map2(): Input data and names separately
map2(list(df1, df2), c("name1", "name2"), fun)
# (2) imap(): Input a named list
imap(list(name1 = df1, name2 = df2), fun)

使用Julien的建议并使用deparse(substitute(df))创建变量并使用它重命名

monthly_fun <- function(x) {
y = deparse(substitute(x))
x <- x %>% 
mutate(obstime = obstime*5) %>%
select(obstime, obsvalue)
names(x)[names(x) == "obsvalue"] <- y
return(x)
}

查看更多的命名方法

最新更新