美文网首页
R语言基础入门(8) tidyverse中的专职函数(中)

R语言基础入门(8) tidyverse中的专职函数(中)

作者: R语言数据分析指南 | 来源:发表于2021-05-30 20:45 被阅读0次

    本节继续来介绍tidyverse中执行特殊功能的一些函数

    unite 多列合并

    library(tidyverse)
    library(magrittr)
    
    iris %>% as_tibble() %>% 
      unite(.,col="Sepal",Sepal.Length:Sepal.Width,sep="|",
            remove = T,na.rm = F)
    
       Sepal   Petal.Length Petal.Width Species
       <chr>          <dbl>       <dbl> <fct>  
     1 5.1|3.5          1.4         0.2 setosa 
     2 4.9|3            1.4         0.2 setosa 
    

    unite 函数有5个参数

    • col 设置合并后列的名称
    • sep 指定分隔符
    • remove 如果为TRUE,则从输出数据框中删除输入列
    • na.rm 如果为TRUE,则在合并数据之前删除缺失值

    上面的案例我们将2列合并成了1列,那么如果我们的数据有20列也需要2列合并为一列,此时该如何操作,请继续往下看

    data <- iris %>% select_if(is.numeric)
    
    result <- list(); b <- 2
    for (i in 1:(data %>% ncol() / b)) {
      result[[i]] <- data %>%
        select((b * i - b + 1):(b * i) %>% all_of()) %>%
        unite(.,A,sep="_",remove = T,na.rm = F)
    }
    
    df <- result %>% as.data.frame() %>% 
      set_colnames(c("Sepal","Petal")) %>% as_tibble()
    
    df
    
       Sepal   Petal  
       <chr>   <chr>  
     1 5.1_3.5 1.4_0.2
     2 4.9_3   1.4_0.2
     3 4.7_3.2 1.3_0.2
    

    通过上面的for循环操作我们完成了数据的合并,这段代码还有别的用处,以后再一一介绍

    sperate拆分列

    df %>% separate(`Sepal`,into=c("A","B"),sep="_")
    
       A     B     Petal  
       <chr> <chr> <chr>  
     1 5.1   3.5   1.4_0.2
     2 4.9   3     1.4_0.2
     3 4.7   3.2   1.3_0.2
    

    只取分隔符前的列

    df %>% separate(`Sepal`,into="Sepal",sep="_")
    

    上面的只是一般的情况,实际中肯定有更复杂的需求,试想如果有多列需要拆分那该如果处理,请继续往下看

    dt <- data.frame(Group = c(rep("A",5),rep("B",5)),
                     A1 = c(rep("A1_B",5),rep("B1_C",5)),
                     A2 = c(rep("A2_D",5),rep("B2_A",5)))
    
    dt %>% as_tibble()
    
       Group A1    A2   
       <chr> <chr> <chr>
     1 A     A1_B  A2_D 
     2 A     A1_B  A2_D 
     3 A     A1_B  A2_D 
     4 A     A1_B  A2_D 
    
    dt %>%
      mutate_at(vars(-Group),~str_split(.,"_",simplify=TRUE)[,2])
    
       Group A1 A2
    1      A  B  D
    2      A  B  D
    3      A  B  D
    4      A  B  D
    5      A  B  D
    6      B  C  A
    7      B  C  A
    

    separate 参考案例

    sparate_rows将折叠的行展开

    示例1
    df <- tibble(
      x = 1:3,y = c("a", "d_e_f", "g_h"),
      z = c("1", "2", "5"))
    
    df
    
          x y     z    
      <int> <chr> <chr>
    1     1 a     1    
    2     2 d_e_f 2    
    3     3 g_h   5 
    
    separate_rows(df,y, z,convert=TRUE,sep="_")
    
          x y         z
      <int> <chr> <int>
    1     1 a         1
    2     2 d         2
    3     2 e         2
    4     2 f         2
    5     3 g         5
    6     3 h         5
    
    示例2
    d <- data.frame(a=c(1:3), 
                    b=c("name1,name2,name3","name4","name5,name6"),
                    c=c("name7","name8,name9","name10"))
    d
    
      a                   b            c
    1 1 name1, name2, name3        name7
    2 2               name4 name8, name9
    3 3        name5, name6       name10
    
    d %>% separate_rows(b) %>% separate_rows(c)
    
          a b     c     
      <int> <chr> <chr> 
    1     1 name1 name7 
    2     1 name2 name7 
    3     1 name3 name7 
    

    加入for循环

    cols <- c("b", "c")
    for(col in cols) {
      d <- separate_rows_(d, col)
    }
    
    d
    

    sparate_rows 参考案例

    另外一种展开折叠行的方法
    df %>% rowwise() %>%
      mutate(y= y %>% strsplit(.,split = "_")) %>%
      unnest_longer(col = y) %>% ungroup()
    
          x y     z    
      <int> <chr> <chr>
    1     1 a     1    
    2     2 d     2    
    3     2 e     2    
    

    喜欢的小伙伴欢迎关注我的公众号

    R语言数据分析指南,持续分享数据可视化的经典案例及一些生信知识,希望对大家有所帮助

    相关文章

      网友评论

          本文标题:R语言基础入门(8) tidyverse中的专职函数(中)

          本文链接:https://www.haomeiwen.com/subject/pnfusltx.html