【发布时间】: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