Объединенные значения в одном столбце после значения другого столбца являются уникальными - PullRequest
0 голосов
/ 05 марта 2020

У меня есть тиббл, который выглядит следующим образом:

library(tidyverse)

df <- tibble(table_name = c("horse", "x", "x", "x", "dog", "x", "rat", "x", "x", "x", "x", "x"),
             value_str = c(NA, "a", "b", "c", NA, "a", NA, "b", "d", "e", "f", "g"))
    > df
    # A tibble: 12 x 2
        table_name value_str
         <chr>      <chr>    
    1 horse      <NA>     
    2 x          a        
    3 x          b        
    4 x          c        
    5 dog        <NA>     
    6 x          a        
    7 rat        <NA>     
    8 x          b        
    9 x          d        
   10 x          e        
   11 x          f        
   12 x          g 

Я хочу создать отдельные векторы для "лошадь", "собака" и "крыса", которые содержат строки из value_str в строках ниже «лошадь» до «собака», «собака» до «крыса» и «крыса» до конца. Я хочу, чтобы вывод был похож на следующие векторы:

vec_horse <- tibble(horse = c("a", "b", "c")) %>% pull(., horse)
vec_dog <- tibble(dog = c("a")) %>% pull(., dog)
vec_rat <- tibble(rat = c("b", "d", "e", "f", "g")) %>% pull(., rat)
    > vec_horse
    [1] "a" "b" "c"

Я бы сделал group_by() для df$table_name, но в этом случае он не работает, так как он касается положения значения df$value_str.

Я не могу свернуть df$value_str в один вектор, потому что выходные данные должны быть отдельными векторами для каждой из уникальных категорий в df$table_name.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Если мы хотим создать три объекта в глобальной среде, один вариант (не рекомендуется)

lst1 <- lapply(split(df$value_str, paste0("vec_", 
   zoo::na.locf(replace(df$table_name,  df$table_name== "x", NA)))), 
        function(x) unique(na.omit(x))) 
list2env(lst1, .GlobalEnv)
vec_dog
#[1] "a"
vec_horse
#[1] "a" "b" "c"
vec_rat
#[1] "b" "d" "e" "f" "g"
0 голосов
/ 05 марта 2020
d = df %>%
    mutate(table_name = if_else(table_name == "x", NA_character_, table_name)) %>%
    fill(table_name) %>%
    group_by(table_name) %>%
    summarise(value_str = list(unique(value_str[!is.na(value_str)]))) %>%
    ungroup()

setNames(d$value_str, d$table_name)
...