r - R中的多项式特征扩展

标签 r statistics

我想对数据框进行多项式特征扩展——例如,使用 (x1, x2, x3) 的 df 的二次扩展应该给出具有 (x1, x2, x3, x1^ 2、x2^2、x3^2、x1x2、x1x3、x2x3)。我目前正在使用 poly(df$x1, df$x2, df$x3, degree=2, raw=T) 但如果我有大量列,这需要不必要的输入。 (并且 poly(df[,1:20], degree=2, raw=T) 不起作用。)执行此操作的最佳方法是什么?

编辑:poly 的列太多(vector is too large 错误)。让它与一个简单的 for 循环一起工作:

polyexp = function(df){
  df.polyexp = df
  colnames = colnames(df)
  for (i in 1:ncol(df)){
    for (j in i:ncol(df)){
      colnames = c(colnames, paste0(names(df)[i],'.',names(df)[j]))
      df.polyexp = cbind(df.polyexp, df[,i]*df[,j])
    }
  }
  names(df.polyexp) = colnames
  return(df.polyexp)
}

只需添加额外的循环来计算高阶项。

最佳答案

您可以使用 do.call 执行此操作:

do.call(poly, c(lapply(1:20, function(x) dat[,x]), degree=2, raw=T))

基本上 do.call 将要调用的函数作为第一个参数(在您的情况下为 poly),并将列表作为第二个参数。此列表的每个元素然后作为参数传递给您的函数。在这里,我们制作了一个列表,其中包含您要处理的所有列(我使用 lapply 来获取该列表而无需输入太多内容),然后是您要传递的两个附加参数。

要查看它在一个简单示例上的工作情况:

dat <- data.frame(x=1:5, y=1:5, z=2:6)
do.call(poly, c(lapply(1:3, function(x) dat[,x]), degree=2, raw=T))
#      1.0.0 2.0.0 0.1.0 1.1.0 0.2.0 0.0.1 1.0.1 0.1.1 0.0.2
# [1,]     1     1     1     1     1     2     2     2     4
# [2,]     2     4     2     4     4     3     6     6     9
# [3,]     3     9     3     9     9     4    12    12    16
# [4,]     4    16     4    16    16     5    20    20    25
# [5,]     5    25     5    25    25     6    30    30    36
# attr(,"degree")
# [1] 1 2 1 2 2 1 2 2 2

关于r - R中的多项式特征扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29318558/

相关文章:

r - 在ggplot中,如何在类别之间沿x和y轴制作网格?

r - 比较 R 中的两个线性模型

python - scipy 的 randint(0, 2) 的 ppf(0) 为 -1.0

r - 如何在 R 中读取 .sav SPSS 文件?

r - 如何在 R 中重新排列图表

performance - 寻找组合的函数优化——内存不足+速度

r - 使用 R 中的 ID 数量随机引入缺失值

algorithm - 协方差矩阵计算

c# - C#计算滚动窗口Max DrawDown

sql - 在数据库的 dplyr 过滤器函数中传递 SQL 函数