#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. <- Спасибо. Не сразу понимаю, но я попробую и дам вам знать!