Как добавить несколько столбцов в фрейм данных с помощью циклов

#r

#r

Вопрос:

У меня есть фрейм данных с 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’, как показано в нижней таблице.

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

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

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

Дипак

Ответ №1:

В 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
 

Комментарии:

1. Ronak <- Тоже спасибо. Это выглядит проще, но я попробую оба и дам вам всем знать! С благодарностью.

2. Ronak <- Спасибо, это прекрасно работает! Никаких забот.

3. Santiago <- Выводится список из 3 элементов, каждый из которых содержит 2 столбца. Есть ли способ помимо использования map_dfc, где эти 6 столбцов могут быть объединены в один фрейм данных? Он также выдает ошибку для ‘simplify = true’ в качестве неиспользуемого аргумента. Любые предложения о том, почему я получаю эту ошибку. Что я делаю не так?

4. @DeepakAgarwal Если вы это сделаете temp <- cbind(df, map_dfc(1:3, ~ list(df$temp .x, df$temp - .x))) , а затем проверьте dim(temp) , отображается ли 9 строк и 8 столбцов правильно? Также это не дало мне никаких предупреждений / ошибок с этой функцией.

5. Ronak <- Зачем вам нужно использовать функцию списка — что делает функция list()? Кроме того, разве cbind не работает с векторами или фреймами данных? Ошибки были не для вашего бита. Это появилось, когда я использовал опцию «упростить» для функции lapply, рекомендованной Сантьяго.

Ответ №2:

Попробуйте 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, ваши исходные данные. Затем вы можете переименовать и упорядочить столбцы по своему усмотрению.

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

Комментарии:

1. <- Спасибо. Не сразу понимаю, но я попробую и дам вам знать!