Индексировать несколько векторов в таблицу в R - PullRequest
0 голосов
/ 21 января 2019

У меня есть три вектора:

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_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 ]

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

Полное раскрытие: я адаптирую часть ответа @ DarrenTsai с помощью data.table, чтобы также указать количество вхождений (поскольку оно отсутствует в его ответе).Использование 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)
0 голосов
/ 21 января 2019

Вот метод 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

(Вы можете отсортировать столбцы по именам столбцов, чтобы получить результат, показанный в вопросе.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...