R - 循环中变量名子集的子集
R - Subsetting subsets of variable names in loops
问:如何在函数或循环中对不断变化的变量的子集进行子集化?
假设我有以下代码来确定多个数据集的回归统计数据:
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')
这适用于 'r.squared'、'adj.r.squared' 等。
但是我想在同一个函数中访问模型的 p 值。
在我选择的函数之外:
summary(fit)$coefficients[2,4]
但是我如何在函数的内部执行此操作??
我尝试失败:
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.vals <- p.func('coefficients[2,4]')
Error in get(p.val) :
object 'summary(fit.dat1)$coefficients[2,4]' not found
我想 get()
不是这样的。有什么函数可以替换 get()
吗?
关于我如何完成这项工作的其他想法?
一种解决方案是使用 eval()
和 parse()
:
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')
问:如何在函数或循环中对不断变化的变量的子集进行子集化?
假设我有以下代码来确定多个数据集的回归统计数据:
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')
这适用于 'r.squared'、'adj.r.squared' 等。 但是我想在同一个函数中访问模型的 p 值。
在我选择的函数之外:
summary(fit)$coefficients[2,4]
但是我如何在函数的内部执行此操作??
我尝试失败:
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.vals <- p.func('coefficients[2,4]')
Error in get(p.val) :
object 'summary(fit.dat1)$coefficients[2,4]' not found
我想 get()
不是这样的。有什么函数可以替换 get()
吗?
关于我如何完成这项工作的其他想法?
一种解决方案是使用 eval()
和 parse()
:
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')