Необходимо отделить имена переменных от столбца в r - PullRequest
0 голосов
/ 03 июля 2019

Итак, у меня довольно плохой набор данных, который мне не разрешено менять. Я хотел бы взять столбец «Draw_CashFlow» и сделать только определенные значения в свои собственные столбцы. Кроме того, мне нужно сделать все переменные одним столбцом (периодом) (от широкого до Tidy, если хотите).

В наборе данных ниже у нас есть столбец (Draw_CashFlow), который начинается с рассматриваемой переменной, за которой следует список идентификаторов, а затем повторяется для следующей переменной. Некоторые переменные могут иметь записи NA.

structure(list(Draw_CashFlow = c("Principal", "R01", 
"R02", "R03", "Workout Recovery Principal", 
"Prepaid Principal", "R01", "R02", "R03", 
"Interest", "R01", "R02"), `PERIOD 1` = c(NA, 
834659.51, 85800.18, 27540.31, NA, NA, 366627.74, 0, 0, NA, 317521.73, 
29175.1), `PERIOD 2` = c(NA, 834659.51, 85800.18, 27540.31, NA, 
NA, 306125.98, 0, 0, NA, 302810.49, 28067.8), `PERIOD 3` = c(NA, 
834659.51, 85800.18, 27540.31, NA, NA, 269970.12, 0, 0, NA, 298529.92, 
27901.36), `PERIOD 4` = c(NA, 834659.51, 85800.18, 27540.31, 
NA, NA, 307049.06, 0, 0, NA, 293821.89, 27724.4)), row.names = c(NA, 
-12L), class = c("tbl_df", "tbl", "data.frame"))

Теперь это конечный список необходимых переменных (принципал, принципал восстановления после тренировки, предоплаченный принципал и проценты), поэтому я попытался создать цикл, в котором он мог бы увидеть, существует ли он, затем собрать, но это не правильно.

После того, как переменные установлены отдельно от Draw_CashFlow, я надеюсь, что это выглядит примерно так (первые четыре строки, игнорируйте сокращения переменных).

ID  Period   Principal  Wrk_Reco_Principal   Prepaid_Principal    Interest
R01      1   834659.51                  NA           366627.74   317521.73
R02      1    85800.18                  NA                0.00    29175.10
R03      1    27540.31                  NA                0.00          NA
R01      2   834659.51                  NA           306125.98   302810.49 

Примечания: Wrl_Reco_Principal равен NA, потому что в этом Draw_CashFlow нет идентификаторов для этой переменной. Имейте в виду, что это должно быть сделано для борьбы с любым количеством идентификаторов, но имена переменных в столбце Draw_CashFlow всегда будут одинаковыми.

1 Ответ

1 голос
/ 03 июля 2019

Вот подход, который предполагает, что значения Draw_CashFlow, начинающиеся с R, являются идентификационными номерами.Вам может понадобиться другой метод (например, !Draw_CashFlow %in% LIST_OF_VARIABLES), если он не подходит.

df %>%
  # create separate columns for ID and Variable
  mutate(ID = if_else(Draw_CashFlow %>% str_starts("R"),
                      Draw_CashFlow, NA_character_),
         Variable = if_else(!Draw_CashFlow %>% str_starts("R"),
                        Draw_CashFlow, NA_character_)) %>%
  fill(Variable) %>%  # Fill down Variable in NA rows from above
  select(-Draw_CashFlow) %>%
  gather(Period, value, -c(ID, Variable)) %>%  # Gather into long form
  drop_na() %>%
  spread(Variable, value, fill = 0) %>% # Spread based on Variable
  mutate(Period = parse_number(Period))


# A tibble: 12 x 5
   ID    Period Interest `Prepaid Principal` Principal
   <chr>  <dbl>    <dbl>               <dbl>     <dbl>
 1 R01        1  317522.             366628.   834660.
 2 R01        2  302810.             306126.   834660.
 3 R01        3  298530.             269970.   834660.
 4 R01        4  293822.             307049.   834660.
 5 R02        1   29175.                  0     85800.
 6 R02        2   28068.                  0     85800.
 7 R02        3   27901.                  0     85800.
 8 R02        4   27724.                  0     85800.
 9 R03        1       0                   0     27540.
10 R03        2       0                   0     27540.
11 R03        3       0                   0     27540.
12 R03        4       0                   0     27540.
...