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

如何替换R中多列中的拟合值,r,linear-regression,R,Linear Regression,我有一个名为new.cars的数据框。我需要对数据框中的所有列应用线性回归公式。在new.cars中有数千列,因此在公式中不可能指示每一列。有四列,PCAs,在我要应用此公式的所有其他列(除PCAs以外的列)的公式中保持不变 第一列(列mercedes)的公式为 我们可以循环查看“新车”的名称(不是PCA),使用粘贴创建公式,使用“PCA”变量作为自变量,提取列表中的“拟合值”(“lst”)。我们通过将“new.cars”中的非PCA列子集来创建一个新的数据集(“new1.cars”)。为列出长

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

第一列(列
mercedes
)的公式为


我们可以循环查看“新车”的
名称
(不是
PCA
),使用
粘贴
创建
公式
,使用“PCA”变量作为自变量,提取
列表中的“拟合值”
(“lst”)。我们通过将“new.cars”中的非PCA列子集来创建一个新的数据集(“new1.cars”)。为
列出长度小于“lst”中元素的“最大”长度的元素,并将输出分配给新数据集

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

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

@akrun抱歉更正了这一点。是否需要类似于
lappy(名称(new.cars)[1:5]、函数(x)lm(公式(粘贴(x,~',粘贴0(“PCA”,1:4,collapse=“+”),数据=new.cars)$fitted.values)的内容。
@akrun是的,这是正确的。我想替换精确的值(例如,如果你从2中减去
-8.409413e-16,它会给你2)。为什么我会得到这个错误:
lm.fit中的错误(x,y,offset=offset,singular.ok=singular.ok,…):0(非NA)案例
@MAPK我没有收到你提供的示例中的任何错误。但是基于错误,对于特定的
列表
元素,可能所有元素都是NA。在这种情况下,我们可以创建一个异常。是的,有一些列只包含NAs。我们如何为这些创建异常?感谢这是数据集生成错误:
结构(列表(梅赛德斯=c(1,1,1,1),大众=c(NA,NA,NA,NA),凯美瑞=c(2,0,0,NA),思域=c(4,1,1,1),费拉里=c(2,2,2,0),PCA1=c(0.02112122,0.019087,0.022184,0.021464),PCA2=c(0.023872,0.024295,0.022471,0.027509),PCA3=c(0.000784,0030.01996,0060.0119),PCA3=c=0.0010,911)(-0.004811,-0.003296,0.001868,-0.001636)),.Names=c(“梅赛德斯”、“大众”、“凯美瑞”、“思域”、“费拉里”、“PCA1”、“PCA2”、“PCA3”、“PCA4”),.Names=c(“S05-F13-P01.GT”、“S08-F10-P01.GT”、“S08-F11-P01.GT”、“S09-F66-P01.GT”),class=“data.frame”)
@MAPK I更新了帖子。请检查是否有帮助
  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")
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)))
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
         })