R - (Tidyverse) Добавить строки в Dataframe в пределах интервалов - PullRequest
0 голосов
/ 10 июня 2018

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

Я пробовал комбинации функций, но я не могу придумать умного решения, которое, я уверен, существует в семействе tideverse.

Создание примера кадра данных: (значения NA для полноты)

df_example <- data.frame(l_bound = c('A00', 'B00', 'C00'), 
                         u_bound = c('A05', 'B03', NA), 
                         value = 1:3)

Вывод:

  l_bound u_bound value
1     A00     A05     1
2     B00     B03     2
3     C00    <NA>     3

Желаемый результат:

   result value
1     A00     1
2     A01     1
3     A02     1
4     A03     1
5     A04     1
6     A05     1
7     B00     2
8     B01     2
9     B02     2
10    B03     2
11    C00     3

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 10 июня 2018

Вот опция, использующая tidyverse.Мы используем map2, чтобы получить последовательность соответствующего элемента 'l_bound', 'u_bound' в list после извлечения числовой части (parse_number) и unnest после select, используя только соответствующие столбцы

library(tidyverse)
library(readr)
df_example %>%
     mutate(result = map2(l_bound, u_bound, ~ 
      if(!is.na(.y)) 
        paste0(substr(.x, 1, 2), parse_number(.x):parse_number(.y)) 
      else as.character(.x))) %>% 
    select(result, value) %>% 
     unnest

Или используя аналогичную методологию в data.table

library(data.table)
setDT(df_example)[, if(!is.na(u_bound)).(response = paste0(substr(l_bound,
      1, 2), parse_number(l_bound):parse_number(u_bound))) 
       else as.character(l_bound), value]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...