R:将对象分配给循环中的向量

时间:2016-04-24 17:48:20

标签: r for-loop variable-assignment

我在for循环中生成了30个子群体的回归,并将它们分配给列表的连续元素(矩阵?)。似乎只有每个回归的第一个组成部分才能进入列表。简单的版本是这样的:

i <- 30
num30 <- with(gapMeans, lm(DHt[Gap==i] ~ Time[Gap==i]))

按我的意愿工作。循环版本:

gmRegs <- NULL
for (i in 1:30){ 
     gmRegs[i] <- with(gapMeans,
                        if(Ht[Gap==i][1] > 1){
                            lm(DHt[Gap==i] ~ Time[Gap==i])
                        } else {NULL}
                 )}

运行正常但是:

num30

# Call:
# lm(formula = DHt[Gap == i] ~ Time[Gap == i])
#
# Coefficients:
# (Intercept)  Time[Gap == i]  
#      24.56874        -0.01546  

gmRegs[30]
# [[1]]
# (Intercept) Time[Gap == i] 
# 24.56874082    -0.01546019 

str()num30描述为13的列表,而gmRegs[30]是1的列表,当我尝试abline(reg=gmRegs[30])时,它不会。所以看起来我的作业只做了thing1[1] <- thing2[1],或者是那种效果 - 我只是无法弄清楚如何正确地将lm()对象整理到所有适合列表槽中。< / p>

1 个答案:

答案 0 :(得分:1)

当您将lm作为项目保存到列表中时,lm本身是R中的结构化元素。如您所知,运行str(num30)会返回13个事项的列表。如果要将每个lm保存为列表中的元素,可以执行以下操作:

# generate random data
response <- runif(90,0,1)
time <- runif(90,10,20)
gap <- rep(1:30,3)

gapMeans <- data.frame(gap,response,time)

现在,head(gapMeans)返回

  gap  response     time
1   1 0.6809973 12.66655
2   2 0.5473042 11.73821
3   3 0.6095777 18.96527
4   4 0.3081830 15.62343
5   5 0.1640612 13.42454
6   6 0.8473997 12.83730

正如理查德在上面指出的那样,你可以将你的呼叫重写为以下lm:

num30 <- lm(response[gap==30] ~ time[gap==30], data = gapMeans)

现在您的循环可以简单地写下以下内容:

gmRegs <- NULL

for(i in 1:30){
  gmRegs[[i]] <- lm(response[gap==i] ~ time[gap==i], data= gapMeans)
}

现在,通过gmRegs访问的gmRegs[[30]]的每个元素本身都是一个lm对象。

plot(gapMeans$time[gapMeans$gap==30], gapMeans$response[gapMeans$gap==30], xlab = 'time', ylab = 'response')
abline(gmRegs[[30]]$coefficients, col = "red")

Example plot, since I can't embed images yet