【问题标题】:How can I parse a pairwise data file with relations like (A-1, A-2, A-3, B-2, B-4, B-5, etc) to a dictionary-like structure in R如何将具有(A-1、A-2、A-3、B-2、B-4、B-5 等)关系的成对数据文件解析为 R 中的类字典结构
【发布时间】:2020-01-13 12:55:06
【问题描述】:

我是一名 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”项保存为键,并将 ENTREZ 中的相同“i”项推送到数组中,作为生成字典/哈希映射的值之前显示,但我不知道该怎么做在 R 中。

【问题讨论】:

  • 试试split(genes, genes$GVR)

标签: r list dictionary parsing hashmap


【解决方案1】:

你想要一个命名列表,你可以像这样得到它:

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

【讨论】:

  • 非常感谢!这确实对我有用,因为我需要以一种以后可以循环使用的方式存储它,以便将函数应用于每个向量。
【解决方案2】:

这里有两种基于 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

【讨论】:

    【解决方案3】:

    已经有一个被接受的答案,但这是另一个,可能更像是发布的预期结果。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多