如何在R中的多列中替换拟合值

时间:2016-04-19 02:50:10

标签: r linear-regression

我有一个名为new.cars的数据框。我需要将线性回归公式应用于我的数据框中的所有列。 new.cars中有数千列,因此在公式中指出它们中的每一列都是不可能的。有四列PCAs在公式中对于我要应用此公式的所有其他列(PCAs以外的列)保持相同。

第一列的公式(列mercedes)是

fit1 <- lm(mercedes ~ PCA1 + PCA2+PCA3+PCA4, data=new.cars)
new.cars[,"mercedes"] <-fit1$fitted.values
所有其他汽车列的

等等.. 用fitted value替换列值的最佳方法是什么(并且在列中省略NA值,这意味着我不想更改NA - 因为它们是空单元格并且需要不适合)?

  new.cars<- structure(list(mercedes = c(1, 1, 1, 1), vw = c(1, 2, 0, NA), 
            camry = c(2, 0, 0, NA), civic = c(4, 1, 1, 1), ferari = c(2, 
            2, 2, 0), PCA1 = c(0.021122, 0.019087, 0.022184, 0.021464
            ), PCA2 = c(0.023872, 0.024295, 0.022471, 0.027509), PCA3 = c(0.000784, 
            0.001996, 0.003911, 0.006119), PCA4 = c(-0.004811, -0.003296, 
            0.001868, -0.001636)), .Names = c("mercedes", "vw", "camry", 
        "civic", "ferari", "PCA1", "PCA2", "PCA3", "PCA4"), row.names = c("S05-F13-P01.GT", 
        "S08-F10-P01.GT", "S08-F11-P01.GT", "S09-F66-P01.GT"), class = "data.frame")

1 个答案:

答案 0 :(得分:1)

我们可能会遍历&#39; new.cars&#39;的names。 (不是PCA),使用&#39; PCA&#39;创建formula paste list变量作为自变量,提取拟合值&#39;在NA(&#39; lst&#39;)中。我们通过对来自&#39; new.cars&#39;的非PCA列进行子集化来创建新数据集(&#39; new1.cars&#39;)。为list元素填充lst <- lapply(names(new.cars)[1:5], function(x) lm(formula(paste(x, '~', paste0("PCA", 1:4, collapse="+"))), data= new.cars)$fitted.values) new1.cars <- new.cars[1:5] new1.cars[] <- lapply(lst, `length<-`,max(lengths(lst))) ,其长度小于“&#39;最大值”。 “&#39; lst&#39;中元素的长度并将输出分配给新数据集。

NA

更新

如果列中只有lm个值,我们可以创建一个例外,以避免在该

上执行lst <- lapply(names(new.cars)[1:5], function(x) { x1 <- new.cars[[x]] if(all(is.na(x1))){ NA } else lm(formula(paste(x, '~', paste0("PCA", 1:4, collapse="+"))), data= new.cars)$fitted.values })
input:range

其余步骤与上述步骤相同。