dplyr-使用使用其他列数据作为参数的函数进行变异?
我有一个包含3个回归模型的列表,称为dplyr-使用使用其他列数据作为参数的函数进行变异?,r,dplyr,R,Dplyr,我有一个包含3个回归模型的列表,称为logregs。我的数据有一个名为type的列,其中只有整数1、2和3,用于决定应该使用logregs中的哪个回归模型,还有一个名为adstock的列,它是回归模型中唯一使用的自变量 我试着做一些类似的事情: dataframe%>%变异(概率=predict(logregs[[type]],type=“prediction”,newdata=adstock)) 示例数据帧: 结构(列表类型=c(3L,3L,3L,3L,3L,3L,3L),adstock=c
logregs
。我的数据有一个名为type
的列,其中只有整数1、2和3,用于决定应该使用logregs
中的哪个回归模型,还有一个名为adstock
的列,它是回归模型中唯一使用的自变量
我试着做一些类似的事情:
dataframe%>%变异(概率=predict(logregs[[type]],type=“prediction”,newdata=adstock))
示例数据帧:
结构(列表类型=c(3L,3L,3L,3L,3L,3L,3L),adstock=c(1.7984,
1.7984,2.7984,6.7984,6.5968,4.992),row.names=c(NA,6L
),class=“data.frame”)
(不幸的是,logregs
模型太大,无法在此进行dput)
使用dplyr如何实现这一点?是的,但您需要在子集
日志记录方面更加小心,并在新数据=
上使用数据.frame
我将基于mtcars
快速生成一组模型
库(dplyr)
型号%
分组依据(cyl=as.character(cyl))%>%
嵌套()%>%
变异(mdl=map(数据,~lm(mpg~disp,数据=.x)))%>%
排列(气缸)%>%
选择(气缸,mdl)%>%
碎片整理()
模型
# $`4`
#电话:
#lm(公式=mpg~disp,数据=0.x)
#系数:
#(截取)显示
# 40.8720 -0.1351
# $`6`
#电话:
#lm(公式=mpg~disp,数据=0.x)
#系数:
#(截取)显示
# 19.081987 0.003605
# $`8`
#电话:
#lm(公式=mpg~disp,数据=0.x)
#系数:
#(截取)显示
# 22.03280 -0.01963
请注意,它们是根据气缸数的字符
编制索引的,否则数字索引可能会混淆
让我们稍微修改一下mtcars$disp
并再次使用它:
set.seed(42)
mtcars%>%
变异(disp=disp+sample(20,size=n(),replace=TRUE)-10)%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
样本(2)
##tibble:6 x 11
##组别:共青团[3]
#mpg气缸显示hp drat wt qsec与am齿轮carb
#
# 1 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
# 2 21.5 4 129. 97 3.7 2.46 20.0 1 0 3 1
# 3 21 6 169 110 3.9 2.62 16.5 0 1 4 4
# 4 19.2 6 173. 123 3.92 3.44 18.3 1 0 4 4
# 5 18.7 8 363 175 3.15 3.44 17.0 0 0 3 2
# 6 16.4 8 281. 180 3.07 4.07 17.4 0 0 3 3
您的日志记录上的[[
索引需要一个类型
,但实际上您传递的是一个向量。由于我这里的数据仍然是分组的,所以我可以使用组变量(cyl
)中的第一个,只需对每个组执行一次调用预测
:
set.seed(42)
mtcars%>%
变异(disp=disp+sample(20,size=n(),replace=TRUE)-10)%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
样本n(2)%>%
突变(mpg2=predict(模型[[as.character(cyl)[1]]],newdata=data.frame(disp)))
##tibble:6 x 12
##组别:共青团[3]
#mpg气缸显示hp drat wt qsec与am齿轮carb mpg2
#
# 1 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2 30.6
# 2 21.5 4 129. 97 3.7 2.46 20.0 1 0 3 1 23.4
# 3 21 6 169 110 3.9 2.62 16.5 0 1 4 4 19.7
# 4 19.2 6 173. 123 3.92 3.44 18.3 1 0 4 4 19.7
# 5 18.7 8 363 175 3.15 3.44 17.0 0 0 3 2 14.9
# 6 16.4 8 281. 180 3.07 4.07 17.4 0 0 3 3 16.5
如果您不想(或不能)分组,则需要每行运行一个预测。这是非常昂贵的,因为它使用单个newdata=
参数运行predict
,但…它仍然有效。为此,我们将map
它:
library(purrr)#map*函数
种子(42)
mtcars%>%
变异(disp=disp+sample(20,size=n(),replace=TRUE)-10)%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
样本n(2)%>%
解组()%>%
变异(mpg2=map2_dbl(cyl,disp,~predict(models[[as.character(.x)]),newdata=data.frame(disp=.y)))
##tibble:6 x 12
#mpg气缸显示hp drat wt qsec与am齿轮carb mpg2
#
# 1 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2 30.6
# 2 21.5 4 129. 97 3.7 2.46 20.0 1 0 3 1 23.4
# 3 21 6 169 110 3.9 2.62 16.5 0 1 4 4 19.7
# 4 19.2 6 173. 123 3.92 3.44 18.3 1 0 4 4 19.7
# 5 18.7 8 363 175 3.15 3.44 17.0 0 0 3 2 14.9
# 6 16.4 8 281. 180 3.07 4.07 17.4 0 0 3 3 16.5
请注意,我必须为newdata=data.frame(disp=.y)
的列命名:以前我们这样做时,data.frame(disp)
将其命名为导入变量的名称。在这种情况下,模型不知道.y
,因此我们必须显式地命名它。是的,但是您需要在子集logregs
上更加小心,并在newdata=
上使用data.frame
我将基于mtcars
快速生成一组模型
库(dplyr)
型号%
分组依据(cyl=as.character(cyl))%>%
嵌套()%>%
变异(mdl=map(数据,~lm(mpg~disp,数据=.x)))%>%
排列(气缸)%>%
选择(气缸,mdl)%>%
碎片整理()
模型
# $`4`
#电话:
#lm(公式=mpg~disp,数据=0.x)
#系数:
#(截取)显示
# 40.8720 -0.1351
# $`6`
#电话:
#lm(公式=mpg~disp,数据=0.x)
#系数:
#(截取)显示
# 19.081987 0.003605
# $`8`
#电话:
#lm(公式=mpg~disp,数据=0.x)
#系数:
#(截取)显示
# 22.03280 -0.01963
请注意,它们是在t上索引的