【问题标题】:How to predict the next column of a dataframe in R如何预测R中数据框的下一列
【发布时间】:2019-12-25 13:16:02
【问题描述】:

我有一个包含许多列的数据框,对于每一行,我想根据前 n 列中的值预测下一列中的值。

我可以使用 lm() 函数一次执行此操作,并且可以使用 sapply() 循环遍历每一行,但我确信有一种更简洁的方法。

我也遇到过这个问题: split on factor, sapply, and lm - 这里的建议也可以,但需要我先使用收集功能,而且我确信必须有更简洁的方法来做到这一点。

下面显示了我的数据的一个简化的、可重现的示例:

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 方法在小型数据集上很好,但是我有数千行,我需要重复这一步〜数百次,所以我想避免循环尝试并保持它尽可能快。 第二种方法可能更接近我所追求的,但需要事先对我的数据进行大量重新格式化,我也想避免这种情况。 所以我的问题是:有没有可以在我的数据上使用的函数/包来预测下一列,而不必遍历每一行?

【问题讨论】:

    标签: r


    【解决方案1】:

    完全不需要循环,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多