如何在R中预测数据帧的下一列

时间:2019-08-20 10:29:12

标签: r

我有一个包含许多列的数据框,并且我想根据前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方法适用于较小的数据集,但是我有成千上万的行,因此我需要重复此步骤约数百次,因此我想避免循环以尝试保持尽可能快。 第二种方法可能更接近我想要的方法,但是需要预先对我的数据进行重新格式化,这也是我想避免的。 所以我的问题是:是否可以在数据上使用一个函数/包来预测下一列,而不必遍历每一行?

1 个答案:

答案 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