как установить значение для всей строки через функцию трубы - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь установить значение по умолчанию для первой строки в фрейме данных равным 1 с помощью функции dplyr pipe.

Как одно из требований для динамического соединения значений в данных с функцией даты. Я буду признателен, если кто-нибудь может помочь мне понять, как я могу установить значение по умолчанию для всех первых строк в приведенном ниже коде. Я уже создал заполнитель, в котором ожидаемое значение по умолчанию.

df2 <- df %>% mutate(MonthDate = as.Date(df$StartMonth,"%m/%d/%Y")) %>%
  filter(MonthDate > as.Date("2005-09-30"))%>%
  # Place holder where I want to set first row of the column to default value of 1#
  mutate(SAABenchmark_VAMI = cumprod(exp(SAABenchmarkstdev)),
         SAABetaOnly_VAMI = cumprod(exp(SAABetaOnly_stdev)),
         HFbenchmark_VAMI = cumprod(exp(HFbenchmarkReturns)),
         ZAAMHF_VAMI = cumprod(exp(ZAAMHFReturns)))%>%
  mutate(SAABenchmark_logVAMI =log(SAABenchmark_VAMI),
         SAABetaOnly_logVAMI=log (SAABetaOnly_VAMI),
         Hfbenchmark_logVAMI=log(HFbenchmark_VAMI),
         ZAAMHF_logVAMI=log(ZAAMHF_VAMI))%>%
  select(MonthDate,SAABenchmark_VAMI:ZAAMHF_logVAMI)%>%
  melt(., id.vars = "MonthDate")

Пожалуйста, найдите мой фрейм данных:

structure(list(StartMonth = structure(c(2L, 9L, 11L, 13L, 15L, 
17L, 19L, 21L, 23L, 4L, 6L, 8L, 3L, 10L, 12L, 14L, 16L, 18L, 
20L, 22L, 24L, 5L, 7L, 1L), .Label = c("", "1/31/2017", "1/31/2018", 
"10/31/2017", "10/31/2018", "11/30/2017", "11/30/2018", "12/31/2017", 
"2/28/2017", "2/28/2018", "3/31/2017", "3/31/2018", "4/30/2017", 
"4/30/2018", "5/31/2017", "5/31/2018", "6/30/2017", "6/30/2018", 
"7/31/2017", "7/31/2018", "8/31/2017", "8/31/2018", "9/30/2017", 
"9/30/2018"), class = "factor"), SAABenchmarkstdev = c(47L, 48L, 
49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 
62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, NA), SAABetaOnly_stdev = c(26L, 
27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 
40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, NA), HFbenchmarkReturns = c(34L, 
35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 
48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, NA), ZAAMHFReturns = c(47L, 
48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 
61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, NA)), class = "data.frame", row.names = c(NA, 
-24L))

1 Ответ

1 голос
/ 15 марта 2019

Вы могли бы что-то сделать с mutate_at().

Здесь я удаляю столбцы, которые вы не хотите добавлять в качестве первой строки в vars(). Затем, чтобы установить в первой строке значение 1 в остальных столбцах, я объединяю 1 с вектором значений минус первое значение.

df %>% 
     mutate(MonthDate = as.Date(df$StartMonth,"%m/%d/%Y")) %>%
     filter(MonthDate > as.Date("2005-09-30")) %>%
     mutate_at(vars(-MonthDate, -StartMonth), list(~c(1, .[-1])))

   StartMonth SAABenchmarkstdev SAABetaOnly_stdev HFbenchmarkReturns ZAAMHFReturns  MonthDate
1   1/31/2017                 1                 1                  1             1 2017-01-31
2   2/28/2017                48                27                 35            48 2017-02-28
3   3/31/2017                49                28                 36            49 2017-03-31
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...