【问题标题】:dplyr: Using poly function to generate polynomial coefficientsdplyr:使用 poly 函数生成多项式系数
【发布时间】:2018-08-14 15:31:52
【问题描述】:

我想将多项式系数附加到 data.frame,如下所示:

df1 <- 
  structure(list(
    Y = c(4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 16, 16, 16, 
          16, 16, 32, 32, 32, 32, 32, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 16, 
          16, 16, 16, 16, 32, 32, 32, 32, 32, 4, 4, 4, 4, 4, 8, 8, 8, 8, 
          8, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32)), 
    class = "data.frame", row.names = c(NA, -60L))

library(tidyverse)
df1 %>%
  dplyr::mutate(
    Linear    = poly(x = Y, degree = 3, raw = TRUE)[ ,1]
  , Quadratic = poly(x = Y, degree = 3, raw = TRUE)[ ,2]  
  , Cubic     = poly(x = Y, degree = 3, raw = TRUE)[ ,3]
    )

不知道有没有这样简洁的方法

df1 %>%
  dplyr::mutate(poly(x = Y, degree = 3, raw = TRUE))

谢谢

【问题讨论】:

    标签: r dplyr tidyverse poly


    【解决方案1】:

    不完全是您希望的方式,但足够接近。我首先将poly(矩阵)的输出转换为data.frame,然后使用!!! 拼接列(将list/data.frame 的每个元素转换为它自己的参数)。 setNames 对于重命名列是可选的:

    library(dplyr)
    
    df1 %>%
      mutate(!!!as.data.frame(poly(x = .$Y, degree = 3, raw = TRUE))) %>%
      setNames(c("Y", "Linear", "Quadratic", "Cubic"))
    

    结果:

        Y Linear Quadratic Cubic
    1   4      4        16    64
    2   4      4        16    64
    3   4      4        16    64
    4   4      4        16    64
    5   4      4        16    64
    6   8      8        64   512
    7   8      8        64   512
    8   8      8        64   512
    9   8      8        64   512
    10  8      8        64   512
    11 16     16       256  4096
    12 16     16       256  4096
    13 16     16       256  4096
    14 16     16       256  4096
    15 16     16       256  4096
    16 32     32      1024 32768
    17 32     32      1024 32768
    18 32     32      1024 32768
    19 32     32      1024 32768
    20 32     32      1024 32768
    ...
    

    【讨论】:

    • Info on !!! here,我以前从未见过。大约在页面下方的 2/3。
    • @zack 它是一个相当新的 dplyr 编程生态系统的一部分,它与其他 tidyverse 函数配合得很好。还要检查rlang
    【解决方案2】:

    另一种选择,虽然我真的很喜欢@user 的解决方案:

    df1 %>%
      left_join(data.frame(Y = unique(.$Y), poly(unique(.$Y), degree = 3, raw = TRUE)),
                by = c('Y' = 'Y')) %>% 
      setNames(c('Y', 'Linear', 'Quadratic', 'Cubic'))
    
        Y Linear Quadratic Cubic
    1   4      4        16    64
    2   4      4        16    64
    3   4      4        16    64
    4   4      4        16    64
    5   4      4        16    64
    6   8      8        64   512
    7   8      8        64   512
    8   8      8        64   512
    9   8      8        64   512
    10  8      8        64   512
    11 16     16       256  4096
    12 16     16       256  4096
    13 16     16       256  4096
    14 16     16       256  4096
    15 16     16       256  4096
    16 32     32      1024 32768
    17 32     32      1024 32768
    18 32     32      1024 32768
    19 32     32      1024 32768
    20 32     32      1024 32768
    

    【讨论】:

    • 真的不需要by = c('Y' = 'Y'),因为它是唯一的相互列
    • 没错,我已经养成了在代码中始终包含两边的习惯,因为我发现它通常可以使代码更具可读性。不过,还是要指出一件好事。
    • 您也可以只输入by = 'Y',因为它们具有相同的名称,但我明白您的意思是保持一致。
    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2015-06-10
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多