Как добавить несколько столбцов во фрейм данных с помощью циклов - PullRequest
1 голос
/ 18 апреля 2019

У меня есть датафрейм с 2 столбцами, а именно "dateperiod" и "temp", например: -

dateperiod,temp
01/01/2019,20.995
02/01/2019,19.89
03/01/2019,17.68
04/01/2019,16.575
05/01/2019,12.155
06/01/2019,13.26
07/01/2019,16.575
08/01/2019,13.26
09/01/2019,19.89

Для указанного количества раз (скажем, n = 3) я хочу создать 6 (n * 2) столбцов, например, так: -

dateperiod,temp,temp_plus1,temp_plus2,temp_plus3,temp_minus1,temp_minus2,temp_minus3
01/01/2019,20.995,21.995,22.995,23.995,19.995,18.995,17.995
02/01/2019,19.89,20.89,21.89,22.89,18.89,17.89,16.89
03/01/2019,17.68,18.68,19.68,20.68,16.68,15.68,14.68
04/01/2019,16.575,17.575,18.575,19.575,15.575,14.575,13.575
05/01/2019,12.155,13.155,14.155,15.155,11.155,10.155,9.155
06/01/2019,13.26,14.26,15.26,16.26,12.26,11.26,10.26
07/01/2019,16.575,17.575,18.575,19.575,15.575,14.575,13.575
08/01/2019,13.26,14.26,15.26,16.26,12.26,11.26,10.26
09/01/2019,19.89,20.89,21.89,22.89,18.89,17.89,16.89

Идея состоит в том, что значения в 3 столбцах значений «плюс» - это исходные значения, увеличенные на «n», а значения в 3 столбцах «минус» - это исходные значения, уменьшенные на «n», как показано в нижнем таблица.

Я не мог найти способ зацикливания (или использовать любую из функций применения), поэтому я только вручную добавил эти столбцы. Но я хотел бы автоматизировать это для большего количества добавленных столбцов, где значение 'n' велико.

Любые предложения будут с благодарностью.

С наилучшими пожеланиями

Дипак

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

В purrr мы можем использовать map_dfc для создания новых столбцов

library(purrr) 
cbind(df, map_dfc(1:3, ~ list(df$temp + .x, df$temp - .x)))


#  dateperiod   temp     V1     V2     V3     V4     V5     V6
#1 01/01/2019 20.995 21.995 19.995 22.995 18.995 23.995 17.995
#2 02/01/2019 19.890 20.890 18.890 21.890 17.890 22.890 16.890
#3 03/01/2019 17.680 18.680 16.680 19.680 15.680 20.680 14.680
#4 04/01/2019 16.575 17.575 15.575 18.575 14.575 19.575 13.575
#5 05/01/2019 12.155 13.155 11.155 14.155 10.155 15.155  9.155
#6 06/01/2019 13.260 14.260 12.260 15.260 11.260 16.260 10.260
#7 07/01/2019 16.575 17.575 15.575 18.575 14.575 19.575 13.575
#8 08/01/2019 13.260 14.260 12.260 15.260 11.260 16.260 10.260
#9 09/01/2019 19.890 20.890 18.890 21.890 17.890 22.890 16.890
0 голосов
/ 18 апреля 2019

Попробуйте lapply () с помощью cbind.data.frame ():

df_2 <- lapply(1:3, function(x) {
a <- df$temp + x
b <- df$temp - x
return(cbind.data.frame(a, b))
}, simplify = TRUE)

cbind.data.frame(df, df_2)

Будучи df, ваши исходные данные. Затем вы можете переименовать и заказать колонны, как вы хотите.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...