如何替换多个列的数据框列?

时间:2016-10-19 12:10:11

标签: r

我有一个像这样的数据框

X <- matrix(rexp(30, rate=.1), ncol=5)
Y <- matrix(rexp(6, rate=.1), ncol=1)
mydata <- data.frame(cbind(Y,X))

现在我想用Xm

的每一列更改X的第三列
Xm <- matrix(rexp(60, rate=.1), ncol=10)

并进行线性回归并保存X3的sd。如果我想手动完成,我会

X[ , 3] <- Xm[ , 1]
mydata <- data.frame(cbind(Y,X))
fit1 = lm(Y~.,data=mydata)

然后

X[ , 3] <- Xm[ , 2]
mydata <- data.frame(cbind(Y,X))
fit2 = lm(Y~.,data=mydata)

然后

X[ , 3] <- Xm[ , 3]
mydata <- data.frame(cbind(Y,X))
fit3 = lm(Y~.,data=mydata)

.
.
.

etc. 

然而,如果我手动完成它需要很长时间而且效率不高。有没有人可以帮助我让它更自动化?

3 个答案:

答案 0 :(得分:1)

你可以循环

喜欢

res=lapply(1:ncol(Xm),function(i){
mydata[[3]] <- Xm[ , i] # change 3-rd column of mydata om i-th colomn of Xm
lm(Y~.,data=mydata)
})

其中res - 您的lm模型列表

如果您只想保存X3标准 你可以这样做吗

res2=lapply(1:ncol(Xm),function(i){
mydata[[3]] <- Xm[ , i]
summary(lm(Y~.,data=mydata))$coefficients["X3","Std. Error"]
})

但在您的示例中,他们都是NaN

答案 1 :(得分:1)

也许还有sapply?

X <- matrix(rexp(30, rate=.1), ncol=5)
Y <- matrix(rexp(6, rate=.1), ncol=1)
mydata <- data.frame(cbind(Y,X))

Xm <- matrix(rexp(60, rate=.1), ncol=10)

sapply(1:ncol(Xm), function(mycol) {
  X[ , 3] <- Xm[ , mycol]
  mydata <- data.frame(cbind(Y,X))
  fit = lm(Y~.,data=mydata) 
  return(sqrt(diag(vcov(fit))))
}, USE.NAMES = F)

更新1: 根据修改提取标准错误 https://stats.stackexchange.com/questions/17571/how-to-store-the-standard-errors-with-the-lm-function-in-r

答案 2 :(得分:1)

我喜欢plyr包,你想要系数:

myfun = function(x) {
    mydata[[3]] <- x
    coef(lm(Y ~ ., data = mydata))
}

ldply(as.data.frame(Xm), myfun)