Мутирование вектора символов через case_when при определенных значениях переменной в определенном порядке - PullRequest
0 голосов
/ 29 января 2019
library(dplyr)

df <- tibble(Letters = c("A", "B", "C", "C", "C", "D", "D", "D", "E", "E", "E"))
meta <- c("foo", "bar", "baz")

   Letters
   <chr>  
 1 A      
 2 B      
 3 C      
 4 C      
 5 C      
 6 D      
 7 D      
 8 D      
 9 E      
10 E      
11 E

Здесь я хотел бы преобразовать вектор символов meta в буквы C, D, E в определенном порядке вектора.

I 'мы пробовали что-то вроде:

df <- df %>% mutate(New = case_when(Letters %in% c("C", "D", "E") ~
                                   meta %>% rep_len(nrow(df)),
                               TRUE ~ NA_character_))

Однако это запускает процесс векторизации в верхней части фрейма данных, и C, D, E заполняются в порядке baz, foo, bar вместо foo, bar, baz.

# A tibble: 11 x 2
   Letters New  
   <chr>   <chr>
 1 A       NA   
 2 B       NA   
 3 C       baz  
 4 C       foo  
 5 C       bar  
 6 D       baz  
 7 D       foo  
 8 D       bar  
 9 E       baz  
10 E       foo  
11 E       bar  

Желаемый вывод:

   Letters New  
   <chr>   <chr>
 1 A       NA   
 2 B       NA   
 3 C       foo  
 4 C       bar  
 5 C       baz  
 6 D       foo  
 7 D       bar  
 8 D       baz  
 9 E       foo  
10 E       bar  
11 E       baz 

1 Ответ

0 голосов
/ 29 января 2019

Если количество повторений символа в столбце 'Буквы' равно длине мета, то простое присвоение сделает это

df$New <- NA
df$New[df$Letters %in% c("C", "D", "E")] <- meta

Или с использованием tidyverse

library(tidyverse)
df %>% 
    group_by(Letters) %>% 
    nest %>%
    mutate(New = case_when(Letters %in% c('C', 'D', 'E') ~ list(meta),
                  TRUE ~ list(NA_character_))) %>% 
    unnest
...