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

将多个向量索引到R中的表中

  •  0
  • MAPK  · 技术社区  · 6 年前

    我有三个向量:

    position <- c(13, 13, 24, 20, 24, 6, 13)
    my_string_allele <- c("T>A", "T>A", "G>C", "C>A", "A>G", "A>G", "G>T")
    position_ref <- c("12006", "1108", "13807", "1970", "9030", "2222", "4434")
    

    我想创建一个表(从最小位置开始),如下所示。我想说明每种情况的发生次数 my_string_allele 每个位置的列,并具有相应的位置 position_ref 列。最简单的方法是什么?

    position    T>A position_ref    G>C position_ref    C>A position_ref    A>G position_ref    G>T position_ref
    6                                                                       1   2222        
    13          2   12006, 1108                                                                 1   4434
    20                                                  1   1970                
    24                               1  13807                               1   9030        
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Darren Tsai    6 年前

    这里是一个 spread() 将数据扩展为宽格式的方法 mutate_all() 计算出现次数。

    数据

    library(tidyverse)
    df <- data.frame(position, my_string_allele, position_ref, stringsAsFactors = F)
    

    代码

    df %>% group_by(position, my_string_allele) %>%
      mutate(position_ref = paste(position_ref, collapse = ", ")) %>% 
      distinct() %>%
      spread(my_string_allele, position_ref) %>%
      mutate_all(funs(N = if_else(is.na(.), NA_integer_, lengths(str_split(., ", ")))))
    

    产量

      position `A>G` `C>A` `G>C` `G>T` `T>A`       `A>G_N` `C>A_N` `G>C_N` `G>T_N` `T>A_N`
         <dbl> <chr> <chr> <chr> <chr> <chr>         <int>   <int>   <int>   <int>   <int>
    1        6 2222  NA    NA    NA    NA                1      NA      NA      NA      NA
    2       13 NA    NA    NA    4434  12006, 1108      NA      NA      NA       1       2
    3       20 NA    1970  NA    NA    NA               NA       1      NA      NA      NA
    4       24 9030  NA    13807 NA    NA                1      NA       1      NA      NA
    

    (可以按列名称对列进行排序,以获得问题中显示的输出。)

        2
  •  2
  •   JdeMello    6 年前

    全面披露:我正在修改@darrentsai的部分答案 data.table 同时提供发生的次数(因为在他的答案中找不到)。使用 数据表 :

    library(data.table)
    
    df <- data.frame(position, my_string_allele, position_ref, stringsAsFactors = F)
    
    setDT(df)
    
    df[, `:=`(position_ref = paste(.N, paste(position_ref, collapse = ", "))),
        by = c("position", "my_string_allele")] %>% 
      unique(., by = c("position", "my_string_allele", "position_ref")) %>% 
      dcast(position ~ my_string_allele, value.var = "position_ref")
    

    结果:

       position    A>G    C>A     G>C    G>T           T>A
    1:        6 1 2222   <NA>    <NA>   <NA>          <NA>
    2:       13   <NA>   <NA>    <NA> 1 4434 2 12006, 1108
    3:       20   <NA> 1 1970    <NA>   <NA>          <NA>
    4:       24 1 9030   <NA> 1 13807   <NA>          <NA>
    

    dplyr (主要基于@darrentsai的回答,也应该投他的票):

    library(dplyr)
    
    df %>% group_by(position, my_string_allele) %>%
      mutate(position_ref = paste(n(), paste(position_ref, collapse = ", "))) %>%
      distinct() %>%
      tidyr::spread(my_string_allele, position_ref)