如何替换R中多列的拟合值
How to replace the fitted value in multiple columns in R
我有一个名为 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 值,这意味着我不想更改 NAs——因为它们是空单元格,不需要装)?
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")
我们可以遍历 'new.cars' 的 names
(不是 PCA
),使用 [=30 创建一个 formula
和 paste
=]变量作为自变量,提取'fitted values'中的一个list
('lst')。我们通过从 'new.cars' 中提取非 PCA 列来创建一个新数据集 ('new1.cars')。为 list
长度比 'lst' 中元素的 'maximum' 长度短的元素填充 NA
,并将输出分配给新数据集。
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)))
更新
如果有只有 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
})
其余步骤同上
我有一个名为 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 值,这意味着我不想更改 NAs——因为它们是空单元格,不需要装)?
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")
我们可以遍历 'new.cars' 的 names
(不是 PCA
),使用 [=30 创建一个 formula
和 paste
=]变量作为自变量,提取'fitted values'中的一个list
('lst')。我们通过从 'new.cars' 中提取非 PCA 列来创建一个新数据集 ('new1.cars')。为 list
长度比 'lst' 中元素的 'maximum' 长度短的元素填充 NA
,并将输出分配给新数据集。
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)))
更新
如果有只有 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
})
其余步骤同上