循环中变量名的R-子集
Q:如何在函数或循环中对变化变量的子集进行子集划分? 假设我有以下代码用于确定多个数据集的回归统计数据:循环中变量名的R-子集,r,string,function,loops,subset,R,String,Function,Loops,Subset,Q:如何在函数或循环中对变化变量的子集进行子集划分? 假设我有以下代码用于确定多个数据集的回归统计数据: dat1 <- data.frame(col1=1:5,col2=6:10) dat2 <- data.frame(col1=11:15,col2=16:20) func <- function(data,col.no){ get(data)[,col.no] } for(i in c('dat1','dat2')) { mod.name <- paste0
dat1 <- data.frame(col1=1:5,col2=6:10)
dat2 <- data.frame(col1=11:15,col2=16:20)
func <- function(data,col.no){
get(data)[,col.no]
}
for(i in c('dat1','dat2')) {
mod.name <- paste0('fit.',i)
assign(mod.name,lm(get(i)[,1]~get(i)[,2]),envir = .GlobalEnv)
}
mod.pvals <- NULL
p.func <- function(attr.name) {
for(i in c('dat1','dat2')) {
mod.name <- paste0('fit.',i)
p.val <- summary(get(mod.name))[attr.name]
mod.pvals <- c(mod.pvals,p.val)
}
mod.pvals
}
r.vals <- p.func('r.squared')
adj.r.vals <- p.func('adj.r.squared')
coef.vals <- p.func('coefficients')
但是如何在函数内部执行此操作呢???
我尝试过,但没有成功:
summary(get(mod.name))['coefficients'][2,4]
Error in summary(get(mod.name))["coefficients"][[2, 4]] :
incorrect number of subscripts
因此,我考虑在上面的函数中更改p.val的代码:
p.val <- paste0('summary(',mod.name ,')$',attr.name)
get(p.val)
p.val一种解决方案是使用eval()
和parse()
:
p.val模型没有p值。模型之间的比较具有p值。您还需要澄清您是否对模型系数的p值感兴趣(它隐式地与没有该系数的模型进行比较,与模型的p值与空模型进行比较)。请注意,$
运算符等同于使用的[[
…而不是[
@42:哦,你说得对。摘要(get(mod.name))[['coverties']][1,4]
会让它起作用。不过,这只是一个孤立的意义。我想知道我是否可以做同样的事情,而不必添加额外的[#,#对于我的代码,所有其他属性名称都不需要。如果您创建了一个数据帧列表并处理该对象,那么这将是一个更干净的代码。使用get
、assign
、eval
和parse
表示您正试图将R转换为SAS或SPSS之类的宏语言。结果是fairly低效且臃肿的编程风格。@42-:您能告诉我您的意思吗?有关Q/a,请参阅
p.val <- paste0('summary(',mod.name ,')$',attr.name)
get(p.val)
p.vals <- p.func('coefficients[2,4]')
Error in get(p.val) :
object 'summary(fit.dat1)$coefficients[2,4]' not found
p.val <- eval(parse(text=paste0("summary(",mod.name,")[",paste0(attr.name),"]")))
mod.pvals <- NULL
p.func <- function(attr.name) {
for(i in c('dat1','dat2')) {
mod.name <- paste0('fit.',i)
p.val <- eval(parse(text=paste0("summary(",mod.name,")[",attr.name,"]")))
mod.pvals <- c(mod.pvals,p.val)
}
mod.pvals
}
r.vals <- p.func(attr.name = '\'r.squared\'')
p.vals <- p.func(attr.name = '[\'coefficients\']][2,4')