Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环中变量名的R-子集_R_String_Function_Loops_Subset - Fatal编程技术网

循环中变量名的R-子集

循环中变量名的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

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('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')