【发布时间】:2023-03-29 02:43:02
【问题描述】:
我正在尝试创建一个函数来线性样条化 h2o 数据集中的变量,但无法让 h2o 正确评估该函数。
这是我对中间样条的初步尝试:
df <- data.frame( AGE = sample(1:100, 1e6, replace = TRUE))
df_A.hex <- as.h2o( df, 'df_A.hex' )
simple_spline <- function( x, L, U ) min( max(x-L,0), U-L)
spline_vector <- Vectorize( simple_spline, vectorize.args = 'x', USE.NAMES = FALSE )
df_A.hex[, 'AGE_12_24'] <- spline_vector( df_A.hex[, 'AGE'], 12, 24)
结果如下:
AGE AGE_12_24
1 9 12
2 7 12
3 33 12
4 84 12
5 86 12
6 25 12
我尝试使用pmin 和pmax,假设它可能没有对列进行矢量化,但我收到以下错误:
> simple_spline <- function( x, L, U ) pmin( pmax(x-L,0), U-L)
> df_A.hex[, 'AGE_12_24'] <- simple_spline( df_A.hex[, 'AGE'], 12, 24)
Error in each[change] : invalid subscript type 'environment'
我猜这是因为 pmin 和 pmax 没有在 h2o 中实现?
我也试过用apply,但也报错:
> simple_spline <- function( x, L, U ) min( max(x-L,0), U-L)
> df_A.hex[, 'AGE_12_24'] <- apply( df_A.hex[, 'AGE'], 1, simple_spline, 12, 24)
> [1] "Lookup failed to find min"
Error in .process.stmnt(stmnt, formalz, envs) :
Don't know what to do with statement: min
我可以编写一个迭代覆盖样条列的函数,如下所示:
df_A.hex[, 'AGE_12_24'] <- df_A.hex[, 'AGE'] - 12
df_A.hex[, 'AGE_12_24'] <- h2o.ifelse( df_A.hex[, 'AGE_12_24'] < 0, 0, df_A.hex[, 'AGE_12_24'] )
df_A.hex[, 'AGE_12_24'] <- h2o.ifelse( df_A.hex[, 'AGE_12_24'] > 12, 12, df_A.hex[, 'AGE_12_24'] )
这得到了我的预期结果:
AGE AGE_12_24
1 9 0
2 7 0
3 33 12
4 84 12
5 86 12
6 25 12
但这是一种相当丑陋的到达方式。我想知道我做错了什么以及如何让函数将值传递给 h2o 框架。
【问题讨论】:
-
您的代码不可重现。我们没有
df_A.hex。请整理一个最小的独立示例。 -
@user2554330 刚刚添加了
-
您的输出与您的输入不匹配(6 行,而不是 1e6),但感谢您发布。当您不将
df转换为h2o对象时,您会得到正确的答案吗?我猜spline_vector没有将您的h2o列识别为向量。 -
是的,如果我在 R 环境中的数据帧上使用
spline_vector,它就可以工作。问题是我无法将数据框放入内存中。