【问题标题】:R: bind columns after lapply() the poly() functionR:在 lapply() poly() 函数之后绑定列
【发布时间】:2018-10-30 04:07:17
【问题描述】:

我想将包含多项式的列添加到数据框 (DF)。

背景:我需要在 glmnet 设置中使用多项式。我不能在 glmnet() 估计命令中直接调用 poly()。我收到一个错误,可能是因为我的“Xtrain”数据包含因子。 我的解决方法是将我的 Xtrain DF 分成两部分,一部分包含所有因素(不需要转换),另一部分包含其余部分,即。数字列。

现在我想将带有多项式的列添加到我的数字 DF 中。 这是我的问题的一个最小示例。

# Some data
x <- 1:10
y <- 11:20
df = as.data.frame(cbind(x,y))

# Looks like this
    x  y
1   1 11
2   2 12
3   3 13

# Now I generate polys
lapply(df, function(i) poly(i, 2, raw=T)[,1:2])

但是,我无法弄清楚如何“绑定”结果。我最终想要的是一个包含 x, x^2, y, y^2 的 DF。顺序无所谓。但是,理想情况下,我也会有列标签(以识别多边形)。比如这样:

     x x2 y  y2
 1   1 1 11 121
 2   2 4 12 144
 3   3 9 13 169

谢谢... 干杯!

【问题讨论】:

    标签: r lapply poly


    【解决方案1】:

    另一种选择是

    as.data.frame(lapply(df, function(i) poly(i, 2, raw=T)[,1:2]))
    #   x.1 x.2 y.1 y.2
    #1    1   1  11 121
    #2    2   4  12 144
    #3    3   9  13 169
    # ...
    

    正如@gpier 和@akrun 已经提到的,您可以使用^ 而不是poly

    n <- 2
    df[paste(names(df), n, sep = "_")] <- df^n
    df
    

    【讨论】:

    • 谢谢!这是如此干净和简单,它还保留了 colnames...
    【解决方案2】:

    我们可以使用do.call

    do.call(cbind, lapply(df, function(i) poly(i, 2, raw=T)[,1:2]))
    

    如果我们只需要正方形

    cbind(df, as.matrix(df)^2)
    

    【讨论】:

    【解决方案3】:

    poly 如果您需要正方形,则不是正确的功能。试试

    cbind(df,lapply(df, function(x) x^2))
    
        x  y   x   y
    1   1 11   1 121
    2   2 12   4 144
    3   3 13   9 169
    4   4 14  16 196
    5   5 15  25 225
    6   6 16  36 256
    7   7 17  49 289
    8   8 18  64 324
    9   9 19  81 361
    10 10 20 100 400
    

    编辑:实际上你甚至不需要lapply,你可以使用cbind(df, df^2)

    【讨论】:

    • 这可以简化为cbind(df, df^2)
    猜你喜欢
    • 2015-10-12
    • 2017-05-10
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多