代码之家  ›  专栏  ›  技术社区  ›  Nautica

在特定顺序的变量的特定值上通过case_改变字符向量

  •  1
  • Nautica  · 技术社区  · 7 年前
    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 以向量的特定顺序。

    我试过这样的方法:

    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 而不是 , 酒吧 , 巴兹 .

    # 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 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    假设字符在“字母”列中重复的次数与“meta”的长度相同,简单的赋值就可以做到这一点。

    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