R: связать столбцы после lapply () функции poly () - PullRequest
0 голосов
/ 29 октября 2018

Я хочу добавить столбцы, содержащие полиномы, в фрейм данных (DF).

Справочная информация: мне нужно использовать полиномы в настройках glmnet. Я не могу вызвать poly () напрямую в команде оценки glmnet (). Я получаю сообщение об ошибке, вероятно, потому что мои данные «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])

Однако я не могу понять, как «связать» результаты. В конце я хочу получить DF, в котором содержатся x, x ^ 2, y, y ^ 2. Заказ не имеет значения. Тем не менее, в идеале у меня также должны быть метки столбцов (для определения полисов). Например, как это:

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

Спасибо ... Ура!

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Другой вариант -

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
0 голосов
/ 29 октября 2018

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)

0 голосов
/ 29 октября 2018

Мы можем использовать do.call

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

Если нам просто нужны квадраты

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