Как я могу проанализировать парный файл данных с такими отношениями, как (A-1, A-2, A-3, B-2, B-4, B-5 ​​и т. Д. c) со словоподобной структурой в R - PullRequest
0 голосов
/ 13 января 2020

Я ruby разработчик, но мне нужно развить некоторую часть моей окончательной рабочей степени в R. Я читаю файл, подобный следующему:

genes = read.delim(opt$pregeneset)

, содержание которого похоже на:

              GVR    ENTREZ
1   chr15.gvr7.17    114791
2   chr15.gvr7.17    283767
3   chr15.gvr7.17 100996331
4   chr15.gvr7.17    390538
5   chr15.gvr7.17    283694
6   chr15.gvr8.16    123606
7   chr15.gvr8.16     81614
8   chr15.gvr8.16     23191
9   chr15.gvr9.15    283685
10  chr15.gvr9.15      7681

И я хотел бы преобразовать эти данные в некую словарную структуру, подобную этой:

gvr_data = {"chr15.gvr7.17": [114791, 283767, 100996331, 390538, 283694],
 "chr15.gvr8.16": [123606, 81614, 23191], 
 "chr15.gvr9.15": [283685, 7681]}

и так далее. Обычно я итерировал бы GVR, сохраняя элемент «i» в качестве ключа и тот же элемент «i» в ENTREZ, помещенный в массив, как значение для генерации карты словаря / ha sh, показанной ранее, но я не знаю как это сделать в R.

Ответы [ 3 ]

1 голос
/ 13 января 2020

Вам нужен именованный список , и вы можете получить его так:

result <- lapply(split.data.frame(genes, genes$GVR), function(x) x$ENTREZ)
print(result)
#> $`chr15.gvr7.17`
#> [1]    114791    283767 100996331    390538    283694
#> 
#> $chr15.gvr8.16
#> [1] 123606  81614  23191
#> 
#> $chr15.gvr9.15
#> [1] 283685   7681

Теперь вы можете использовать оператор $ для доступа к любому отдельному вектору, как этот:

result$chr15.gvr9.15
#> [1] 283685   7681
0 голосов
/ 13 января 2020

Уже есть принятый ответ, но вот еще один, возможно, больше похожий на опубликованный ожидаемый результат.

aggregate(ENTREZ ~ GVR, genes, function(x){
  x <- paste(x, collapse = ', ')
  paste0('[', x, ']')
})
#            GVR                                      ENTREZ
#1 chr15.gvr7.17 [114791, 283767, 100996331, 390538, 283694]
#2 chr15.gvr8.16                      [123606, 81614, 23191]
#3 chr15.gvr9.15                              [283685, 7681]

Или в формате JSON.

agg <- aggregate(ENTREZ ~ GVR, genes, paste)
jsonlite::toJSON(agg, "values", pretty = TRUE)
#[
#  ["chr15.gvr7.17", ["114791", "283767", "100996331", "390538", "283694"]],
#  ["chr15.gvr8.16", ["123606", "81614", "23191"]],
#  ["chr15.gvr9.15", ["283685", "7681"]]
#] 

Данные.

genes <- read.table(text = "
              GVR    ENTREZ
1   chr15.gvr7.17    114791
2   chr15.gvr7.17    283767
3   chr15.gvr7.17 100996331
4   chr15.gvr7.17    390538
5   chr15.gvr7.17    283694
6   chr15.gvr8.16    123606
7   chr15.gvr8.16     81614
8   chr15.gvr8.16     23191
9   chr15.gvr9.15    283685
10  chr15.gvr9.15      7681
", header = TRUE)
0 голосов
/ 13 января 2020

Вот два типа вывода с базой R, возможно, один из них - то, что вам нужно

  • Решение 1: вывод в виде фрейма данных
gvr_data_df  <- aggregate(ENTREZ~GVR, genes, FUN = function(x) x)

> gvr_data_df
            GVR                                    ENTREZ
1 chr15.gvr7.17 114791, 283767, 100996331, 390538, 283694
2 chr15.gvr8.16                      123606, 81614, 23191
3 chr15.gvr9.15                              283685, 7681
  • Решение 2: вывод в виде списка
gvr_data_lst <- lapply(split(genes,genes$GVR),`[[`,2)

> gvr_data_lst
$chr15.gvr7.17
[1]    114791    283767 100996331    390538    283694

$chr15.gvr8.16
[1] 123606  81614  23191

$chr15.gvr9.15
[1] 283685   7681
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...