R 使用在函数中调用的数据帧列的输入编写函数
我正在尝试编写一个函数,它有一列数据帧作为输入参数,这些数据帧在函数中被迭代调用 示例如下所示: 编写一个名为iter的函数,该函数有两个输入: 1) 数据帧列表 2) df1和df2都包含的列的名称R 使用在函数中调用的数据帧列的输入编写函数,r,function,rstudio,lm,R,Function,Rstudio,Lm,我正在尝试编写一个函数,它有一列数据帧作为输入参数,这些数据帧在函数中被迭代调用 示例如下所示: 编写一个名为iter的函数,该函数有两个输入: 1) 数据帧列表 2) df1和df2都包含的列的名称 iter <- function (dflist, columnname) { for (df in dflist){ df[,bla:=cut(columnname, etc)] lm(...data=df) etc } } 但是我得到了同样的
iter <- function (dflist, columnname) {
for (df in dflist){
df[,bla:=cut(columnname, etc)]
lm(...data=df)
etc
}
}
但是我得到了同样的错误你真的需要没有引号的列吗?我发现将
columname
参数作为单个character
string对象动态更改列要容易得多。您可以使用as.symbol()
–或as.name()
–创建一个对象(sym
,在函数中),该对象将在以后让您将所述对象称为R对象,而不是其值,无论分配给columname
然后,您可以在常规的data.table
语法中使用eval()
library(data.table)
dList <- list(
mtcars,
mtcars
)
dList <- lapply(dList, function(x) copy(as.data.table(x)))
iter <- function (dflist, columnname) {
new_var <- paste0(columnname, "_sq")
sym <- as.symbol(columnname)
for (df in dflist){
df[,(new_var):= eval(sym)^2]
}
}
iter(dList, "mpg")
请记住,iter
将改变dList
中的对象,即使您没有在函数中指定return
。赋值运算符:=
通过引用赋值。请对此进行更彻底的解释。如果要更改函数“但在外部”中的对象并返回包含结果对象的列表,则需要首先使用data.table::copy
:
iter <- function (dflist, columnname) {
new_var <- paste0(columnname, "_sq")
res <- vector("list", length(dflist))
sym <- as.symbol(columnname)
for (i in seq_along(res)){
dt <- copy(dflist[[i]])
res[[i]] <- dt[,(new_var):= eval(sym)^2]
}
return(res)
}
iter感谢您的详细回答,是的,因为我要找的是.symbol。
> head(dList[[2]], 1)
mpg cyl disp hp drat wt qsec vs am gear carb mpg_sq
1: 21 6 160 110 3.9 2.62 16.46 0 1 4 4 441
iter <- function (dflist, columnname) {
new_var <- paste0(columnname, "_sq")
res <- vector("list", length(dflist))
sym <- as.symbol(columnname)
for (i in seq_along(res)){
dt <- copy(dflist[[i]])
res[[i]] <- dt[,(new_var):= eval(sym)^2]
}
return(res)
}