我有一个包含许多列的数据框,并且我想根据前n列中的值来预测每一行的值。
我可以使用lm()函数一次完成这一行,并且可以使用sapply()遍历每一行,但是我敢肯定有一种更整洁的方法。
我也遇到了这个问题: Python demo-这里的建议也可以,但是要求我先使用collect函数,然后再次确保必须有一种更整洁的方法。
以下显示了我的数据的简化,可复制的示例:
set.seed(0)
my_df <- data.frame(y1 = rnorm(10), y2 = rnorm(10), y3 = rnorm(10), y4 = rnorm(10), y5 = rnorm(10))
我可以使用以下代码给我带来以下结果:
library(dplyr)
my_df_m <- sapply(1:10, FUN = function(x) {lm(as.numeric(my_df[x,1:5])~c(1:5))}[[1]][2])
my_df %>% mutate(y6 = y5 + my_df_m)
我还可以使用以下代码,这需要首先对我的数据进行一些重新格式化(对于数据表和框架的混合,我深表歉意,我承认我对data.table包没有太多的经验):
library(data.table)
library(tidyr)
my_df <- cbind(dataSet = c(1:10), my_df)
my_df_gather <- gather(my_df, key = "x", "y", -dataSet) %>%
mutate(x = rep(1:5, each = 10))
my_DT <- data.table(my_df_gather)
my_df %>% mutate(y6 = y5 + my_DT[,list(m = lm(y~x)$coefficients[2]), by = dataSet]$m)
上面显示的两种方法都不是理想的,sapply方法适用于较小的数据集,但是我有成千上万的行,因此我需要重复此步骤约数百次,因此我想避免循环以尝试保持尽可能快。 第二种方法可能更接近我想要的方法,但是需要预先对我的数据进行重新格式化,这也是我想避免的。 所以我的问题是:是否可以在数据上使用一个函数/包来预测下一列,而不必遍历每一行?
答案 0 :(得分:0)
根本不需要循环,lm
可以适合多个回归模型。
regr <- seq_len(ncol(my_df))
fit <- lm(t(my_df) ~ regr)
newdf <- data.frame(regr = ncol(my_df) + 1)
pred <- predict(fit, newdata = newdf)
pred
# [,1] [,2] [,3] [,4] [,5] [,6]
#1 0.6620746 0.4630261 -0.9693691 -1.309558 -0.7172375 0.4813361
# [,7] [,8] [,9] [,10]
#1 -0.1915871 0.7793626 0.9866084 -1.150298