我在R中有一个简单的函数来修改数据帧
monthly_fun <- function(x){
x %>%
mutate(obstime = convert_dates(obstime)) %>%
select(obstime, x = obsvalue)
}
当将函数应用于数据框df
,即monthly_fun(df)
时,我希望df
为obsvalue
的名称。在我目前的代码中,名称显然是"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)
}
查看更多的命名方法