如何通过粘贴为对象指定名称
How to assign a name to an object by pasting
考虑数据框dat
:
dat <- data.frame(Loc = c("NY","MA"),
ID = c(1:2),
Sex = c("M","F")
)
假装有更多数据与此相关,并且每个 ID
有多个观察结果,我想拟合一个模型并将其保存在一个名为 NYM1mod
的对象中,这对我来说将代表 "model for New York Male number 1"
我可以用:
paste(dat[1,1], dat[1,3], dat[1,2],"mod", sep="")
输出我想要的:
[1] "NYM1mod"
但是我怎样才能做这样的事情并使输出成为一个新对象的名称呢?
例如,为什么不能像这样将数字 3 分配给输出 "NYM1mod"?:
paste(dat[1,1], dat[1,3], dat[1,2],"mod", sep="") <- 3
如评论所述,考虑使用列表而不是许多单独的对象。具体来说,在定义的函数中概括您的建模过程。用 lapply
迭代它到 return 个对象列表。然后用 setNames
重命名为 return 单个 命名的 对象列表,所有对象均可索引。一些或一项没有用许多单独的对象淹没全局环境:
proc_model <- function(...) {
# MODELING PROCESS
...
return(model)
}
model_list <- setNames(lapply(sequence_pass_as_params, proc_model),
paste0(dat$Loc, dat$Sex, dat$ID, "mod"))
# ALL MODELS
model_list
# SELECT MODELS
model_list$NYM1mod
model_list$MAF2mod
事实上,如果我了解您的需求,请考虑 by
( 的另一个兄弟应用 系列作为 tapply
的面向对象包装器)传递子集Loc、ID 和 Sex 的数据帧到您的建模函数中。对于不存在的子集 and/or 使用 tryCatch
包装过程会产生建模错误。
# RECEIVE DATA FRAME AS PARAMETER
proc_model <- function(df) {
tryCatch({
# MODELING PROCESS
model <- lm(..., data = df)
}, error = function(e) return(NULL)
)
}
# BUILD MODEL LIST BY SUBSETS
model_list <- by(dat, dat[,c("Loc", "Sex", "ID"), proc_model)
# RENAME ELEMENTS IN LIST WITH UNIQUE NAMES
model_list <- setNames(model_list, unique(paste0(dat$Loc, dat$Sex, dat$ID, "mod")))
# REMOVE EMPTY MODELS (I.E., ITEMS THAT RETURN NULL)
model_list <- Filter(model_list, LENGTH)
# ALL MODELS
model_list
# SELECT MODELS
model_list$NYM1mod
model_list$MAF2mod
考虑数据框dat
:
dat <- data.frame(Loc = c("NY","MA"),
ID = c(1:2),
Sex = c("M","F")
)
假装有更多数据与此相关,并且每个 ID
有多个观察结果,我想拟合一个模型并将其保存在一个名为 NYM1mod
的对象中,这对我来说将代表 "model for New York Male number 1"
我可以用:
paste(dat[1,1], dat[1,3], dat[1,2],"mod", sep="")
输出我想要的:
[1] "NYM1mod"
但是我怎样才能做这样的事情并使输出成为一个新对象的名称呢?
例如,为什么不能像这样将数字 3 分配给输出 "NYM1mod"?:
paste(dat[1,1], dat[1,3], dat[1,2],"mod", sep="") <- 3
如评论所述,考虑使用列表而不是许多单独的对象。具体来说,在定义的函数中概括您的建模过程。用 lapply
迭代它到 return 个对象列表。然后用 setNames
重命名为 return 单个 命名的 对象列表,所有对象均可索引。一些或一项没有用许多单独的对象淹没全局环境:
proc_model <- function(...) {
# MODELING PROCESS
...
return(model)
}
model_list <- setNames(lapply(sequence_pass_as_params, proc_model),
paste0(dat$Loc, dat$Sex, dat$ID, "mod"))
# ALL MODELS
model_list
# SELECT MODELS
model_list$NYM1mod
model_list$MAF2mod
事实上,如果我了解您的需求,请考虑 by
( 的另一个兄弟应用 系列作为 tapply
的面向对象包装器)传递子集Loc、ID 和 Sex 的数据帧到您的建模函数中。对于不存在的子集 and/or 使用 tryCatch
包装过程会产生建模错误。
# RECEIVE DATA FRAME AS PARAMETER
proc_model <- function(df) {
tryCatch({
# MODELING PROCESS
model <- lm(..., data = df)
}, error = function(e) return(NULL)
)
}
# BUILD MODEL LIST BY SUBSETS
model_list <- by(dat, dat[,c("Loc", "Sex", "ID"), proc_model)
# RENAME ELEMENTS IN LIST WITH UNIQUE NAMES
model_list <- setNames(model_list, unique(paste0(dat$Loc, dat$Sex, dat$ID, "mod")))
# REMOVE EMPTY MODELS (I.E., ITEMS THAT RETURN NULL)
model_list <- Filter(model_list, LENGTH)
# ALL MODELS
model_list
# SELECT MODELS
model_list$NYM1mod
model_list$MAF2mod