使用 R 和 tidyverse 将 tidy 表转换为深度嵌套列表

2024-02-12

我正在尝试使用 R/tidyverse 将整洁的表(例如下面的示例)转换为嵌套列表。使用一些 tidyverse 魔法,我能够将其转换为深度为三的嵌套列表,但我不知道如何将其嵌套得更深。

采用以下示例输入:

library(tidyverse)
library(stringi)

n_patient = 2
n_samples = 3
n_readgroup = 4
n_mate = 2

df = data.frame(patient   = rep(rep(LETTERS[1:n_patient], n_samples),2),
                sample    = rep(rep(seq(1:n_samples), each = n_patient),2),
                readgroup = rep(stri_rand_strings(n_patient * n_samples * n_readgroup, 6, '[A-Z]'),2),
                mate      = rep(1:n_mate, each = n_patient * n_samples * n_readgroup)) %>%
  mutate(file = sprintf("%s.%s.%s_%s", patient, sample, readgroup, mate)) %>%
  arrange(file)

json = df %>% 
  nest(-patient, .key = samples) %>%
  mutate(samples = map(samples, nest, -sample, .key=readgroups))

jsonlite::toJSON(json, pretty = T)

例如看起来像这样

> head(df)
  patient sample readgroup mate         file
1       A      1    FCSDRJ    1 A.1.FCSDRJ_1
2       A      1    FCSDRJ    2 A.1.FCSDRJ_2
3       A      1    IAXDPR    1 A.1.IAXDPR_1
4       A      1    IAXDPR    2 A.1.IAXDPR_2
5       A      1    MLDBKZ    1 A.1.MLDBKZ_1
6       A      1    MLDBKZ    2 A.1.MLDBKZ_2

输出如下所示:

 [
  {
    "patient": "A",
    "samples": [
      {
        "sample": 1,
        "readgroups": [
          {
            "readgroup": "FCSDRJ",
            "mate": 1,
            "file": "A.1.FCSDRJ_1"
          },
          {
            "readgroup": "FCSDRJ",
            "mate": 2,
            "file": "A.1.FCSDRJ_2"
          },
          {
            "readgroup": "IAXDPR",
            "mate": 1,
            "file": "A.1.IAXDPR_1"
          },
          {
            "readgroup": "IAXDPR",
            "mate": 2,
            "file": "A.1.IAXDPR_2"
          },
          {
            "readgroup": "MLDBKZ",
            "mate": 1,
            "file": "A.1.MLDBKZ_1"
          },
          {
            "readgroup": "MLDBKZ",
            "mate": 2,
            "file": "A.1.MLDBKZ_2"
          },
          {
            "readgroup": "OMTWHK",
            "mate": 1,
            "file": "A.1.OMTWHK_1"
          },
          {
            "readgroup": "OMTWHK",
            "mate": 2,
            "file": "A.1.OMTWHK_2"
          }
        ]
      },
      {
        "sample": 2,
        "readgroups": [
          {
            "readgroup": "BHAEFA",
            "mate": 1,
            "file": "A.2.BHAEFA_1"
          },
          {
            "readgroup": "BHAEFA",
            "mate": 2,
            "file": "A.2.BHAEFA_2"
          },
          {
            "readgroup": "DIBRHT",
            "mate": 1,
            "file": "A.2.DIBRHT_1"
          },
          {
            "readgroup": "DIBRHT",
            "mate": 2,
            "file": "A.2.DIBRHT_2"
          },
          {
            "readgroup": "HHMOSV",
            "mate": 1,
            "file": "A.2.HHMOSV_1"
          },
          {
            "readgroup": "HHMOSV",
            "mate": 2,
            "file": "A.2.HHMOSV_2"
          },
          {
            "readgroup": "KJXTPN",
            "mate": 1,
            "file": "A.2.KJXTPN_1"
          },
          {
            "readgroup": "KJXTPN",
            "mate": 2,
            "file": "A.2.KJXTPN_2"
          }
        ]
      },
      {
        "sample": 3,
        "readgroups": [
          {
            "readgroup": "CHXJMM",
            "mate": 1,
            "file": "A.3.CHXJMM_1"
          },
          {
            "readgroup": "CHXJMM",
            "mate": 2,
            "file": "A.3.CHXJMM_2"
          },
          {
            "readgroup": "MDWRBS",
            "mate": 1,
            "file": "A.3.MDWRBS_1"
          },
          {
            "readgroup": "MDWRBS",
            "mate": 2,
            "file": "A.3.MDWRBS_2"
          },
          {
            "readgroup": "RHHKGK",
            "mate": 1,
            "file": "A.3.RHHKGK_1"
          },
          {
            "readgroup": "RHHKGK",
            "mate": 2,
            "file": "A.3.RHHKGK_2"
          },
          {
            "readgroup": "VVVJFD",
            "mate": 1,
            "file": "A.3.VVVJFD_1"
          },
          {
            "readgroup": "VVVJFD",
            "mate": 2,
            "file": "A.3.VVVJFD_2"
          }
        ]
      }
    ]
  },
  {
    "patient": "B",
    "samples": [
      {
        "sample": 1,
        "readgroups": [
          {
            "readgroup": "QAFCOS",
            "mate": 1,
            "file": "B.1.QAFCOS_1"
          },
          {
            "readgroup": "QAFCOS",
            "mate": 2,
            "file": "B.1.QAFCOS_2"
          },
          {
            "readgroup": "TJYYMQ",
            "mate": 1,
            "file": "B.1.TJYYMQ_1"
          },
          {
            "readgroup": "TJYYMQ",
            "mate": 2,
            "file": "B.1.TJYYMQ_2"
          },
          {
            "readgroup": "YMHWOI",
            "mate": 1,
            "file": "B.1.YMHWOI_1"
          },
          {
            "readgroup": "YMHWOI",
            "mate": 2,
            "file": "B.1.YMHWOI_2"
          },
          {
            "readgroup": "ZOMSBU",
            "mate": 1,
            "file": "B.1.ZOMSBU_1"
          },
          {
            "readgroup": "ZOMSBU",
            "mate": 2,
            "file": "B.1.ZOMSBU_2"
          }
        ]
      },
      {
        "sample": 2,
        "readgroups": [
          {
            "readgroup": "CZWHXP",
            "mate": 1,
            "file": "B.2.CZWHXP_1"
          },
          {
            "readgroup": "CZWHXP",
            "mate": 2,
            "file": "B.2.CZWHXP_2"
          },
          {
            "readgroup": "MIMMNH",
            "mate": 1,
            "file": "B.2.MIMMNH_1"
          },
          {
            "readgroup": "MIMMNH",
            "mate": 2,
            "file": "B.2.MIMMNH_2"
          },
          {
            "readgroup": "RCWMQY",
            "mate": 1,
            "file": "B.2.RCWMQY_1"
          },
          {
            "readgroup": "RCWMQY",
            "mate": 2,
            "file": "B.2.RCWMQY_2"
          },
          {
            "readgroup": "WDMLHE",
            "mate": 1,
            "file": "B.2.WDMLHE_1"
          },
          {
            "readgroup": "WDMLHE",
            "mate": 2,
            "file": "B.2.WDMLHE_2"
          }
        ]
      },
      {
        "sample": 3,
        "readgroups": [
          {
            "readgroup": "DWITMU",
            "mate": 1,
            "file": "B.3.DWITMU_1"
          },
          {
            "readgroup": "DWITMU",
            "mate": 2,
            "file": "B.3.DWITMU_2"
          },
          {
            "readgroup": "GCLWMA",
            "mate": 1,
            "file": "B.3.GCLWMA_1"
          },
          {
            "readgroup": "GCLWMA",
            "mate": 2,
            "file": "B.3.GCLWMA_2"
          },
          {
            "readgroup": "QZZKQB",
            "mate": 1,
            "file": "B.3.QZZKQB_1"
          },
          {
            "readgroup": "QZZKQB",
            "mate": 2,
            "file": "B.3.QZZKQB_2"
          },
          {
            "readgroup": "WJKGRB",
            "mate": 1,
            "file": "B.3.WJKGRB_1"
          },
          {
            "readgroup": "WJKGRB",
            "mate": 2,
            "file": "B.3.WJKGRB_2"
          }
        ]
      }
    ]
  }
] 

这很棒,除了我还想按“mate”嵌套(理论上可以按任意数量的变量嵌套,没有任何深度限制)。有什么建议如何实现这一点?

Thanks!


第一步是注意您正在向后执行,这会提供与您相同的输出,但更简单:

json2 <- df %>% nest(-(1:2),.key=readgroups) %>% nest(-1,.key=samples)

然后我们可以扩展它:

json3 <- df %>% nest(-(1:3),.key=mate) %>% nest(-(1:2),.key=readgroups) %>% nest(-1,.key=samples)

jsonlite::toJSON(json3,pretty=T)

output:

[
  {
    "patient": "A",
    "samples": [
      {
        "sample": 1,
        "readgroups": [
          {
            "readgroup": "FUPEYR",
            "mate": [
              {
                "mate": 1,
                "file": "A.1.FUPEYR_1"
              },
              {
                "mate": 2,
                "file": "A.1.FUPEYR_2"
              }
...

如有必要,对其进行概括:

vars <- names(df)[-1] # or whatever variables you want to nest, order matters!
var_pairs <- map((length(vars)-1):1,~vars[.x:(.x+1)])
json4 <- reduce(var_pairs,~{nm<-.y[1];nest(.x,.y,.key=!!enquo(nm))},.init=df)

jsonlite::toJSON(json4,pretty=T)

output:

[
  {
    "patient": "A",
    "sample": [
      {
        "sample": 1,
        "readgroup": [
          {
            "readgroup": "FUPEYR",
            "mate": [
              {
                "mate": 1,
                "file": "A.1.FUPEYR_1"
              },
              {
                "mate": 2,
                "file": "A.1.FUPEYR_2"
              }
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 R 和 tidyverse 将 tidy 表转换为深度嵌套列表 的相关文章

随机推荐

  • 如何在关闭时完全删除对话框

    当 ajax 操作失败时 我创建一个包含错误的新 div 然后将其显示为对话框 当对话框关闭时 我想完全销毁并再次删除 div 我怎样才能做到这一点 我的代码目前看起来像这样 div We failed div dialog title E
  • 在Java中查找数组中的元素

    Java 是否有内置函数允许我线性搜索数组中的元素 还是必须只使用 for 循环 有一个contains列表的方法 所以你应该能够这样做 Arrays asList yourArray contains yourObject 警告 这可能不
  • Flutter - 英雄动画不适用于选项卡导航器

    我是颤振新手 我正在使用英雄小部件为浮动按钮制作动画 我有底部导航 我必须使用选项卡导航器打开页面 但英雄动画不起作用 我使用了所有可能的解决方案 但英雄动画仍然不适用于页面路由 这是我的代码片段 FloatingActionButton
  • 无法删除全局包

    尝试删除全局包 但似乎没有删除它 eslint v v1 10 3 npm uninstall eslint g sudo npm uninstall eslint g eslint v v1 10 3 sudo eslint v v1 1
  • 如何使用之前输入的值填充自定义结帐字段,例如默认的 WooCommerce 结帐字段?

    我使用以下代码添加了一个自定义字段 add action woocommerce before order notes bbloomer add custom checkout field function bbloomer add cus
  • 在python中读取15M行csv文件的有效方法

    对于我的应用程序 我需要读取多个文件 每个文件有 15 M 行 将它们存储在 DataFrame 中 并将 DataFrame 保存为 HDFS5 格式 我已经尝试过不同的方法 特别是具有 chunksize 和 dtype 规范的 pan
  • 获取调用者类

    我正在编写 Logger 并在自动添加类名时遇到问题 我从中调用了 print log 方法 例如这样的事情 class Logger def self print log string puts Time now strftime T c
  • 美国电话号码验证

    我有一个网站表单 需要输入美国电话号码以供后续使用 在这种情况下这是非常有必要的 我想尝试消除用户输入垃圾数据330 000 0000 我已经看到了第三方为您验证电话号码的一些选项 但是我不知道这是否是这种情况的最佳选择 但是 如果您使用过
  • PyQt 项目视图自定义拖放

    我正在 QTableView 中进行自定义拖放实现 当我拖动一个单元格并将其放在另一个单元格上时 我想根据拖动的内容和放置的位置手动更改模型中的一些数据 我怎样才能做到这一点 我已经阅读了所有 Qt 文档 但我完全迷失了 特别是通过拖放 C
  • Couchbase 中的存储桶密码

    我正在创建一个使用 springboot 和 Couchbase 进行反应式编程的演示项目 我在 application properties 文件中设置了以下属性 spring couchbase bootstrap hosts loca
  • APK 0(零)设备兼容性

    我正在生成一个要在商店上发布的 APK 它是现有应用程序的更新 上传到 Google Play Console 后 支持的 Android 设备 0 台设备 这是我的清单
  • vue js如何使用方法将数据从父组件、v-for循环列表传递到子组件

    我试图实现在子组件 模态组件 中显示每个项目收据数组的项目列表 但一直无法这样做 方法display receipts 是将receipts modal的数据值改为true 我可以在哪里放置 v bind 来传递数组 任何帮助深表感谢 Pa
  • 使用networkx从图中删除边

    我正在尝试转换DiGraph成n叉树并按层序或BFS显示节点 我的树与此类似 但更大 为简单起见 使用以下示例 G networkx DiGraph G add edges from n n1 n n2 n n3 G add edges f
  • 是否可以使用服务帐户访问Provisioning API?

    我的服务帐户范围是 https apps apis google com a feeds user https apps apis google com a feeds user 和 DriveScope DRIVE 我在我的服务帐户 ID
  • VS2015:警告MSB3884:找不到规则集文件

    将我的 WinForms VS2013 项目升级到 VS2015 后 我开始看到 MSB3884 找不到规则集文件 警告 Google 搜索发现了一篇 MSDN 文章 Stack Overflow 文章以及许多其他网站都指向了该文章 类似问
  • R可以识别Excel文件是否有注释单元格吗?

    我有一张 Excel 表格 xlsx 其中有一些注释的单元格 导入R后 R有什么办法可以识别注释的单元格吗 因为我必须仅对注释的单元格使用一些 if else 条件 Let s say we have this file test xlsx
  • 以逗号或分号分隔的自动完成文本框

    我想要一个TextBox支持自动完成 并允许用户输入以逗号或分号分隔的多个单词 并为每个单词提供建议 我有一个标准TextBox with textBox AutoCompleteCustomSource AddRange new appl
  • Haskell、通道、STM、线程、消息传递

    我正在尝试使用 Channels STM 在 Haskell 中实现消息传递 也许这是一个糟糕的想法 并且有更好的方法在 Haskell 中实现 使用消息传递 如果是这种情况 请告诉我 然而 我的探索提出了一些关于并发 Haskell 的基
  • Firebase Chrome 扩展 Javascript content_security_policy 清单 3

    我刚刚开始工作chrome extensions and javascript看到每个人都建议使用Manifest version 3开始 我想实施firebase进入我的扩展和旧的Manifest version 2我需要输入这个 con
  • 使用 R 和 tidyverse 将 tidy 表转换为深度嵌套列表

    我正在尝试使用 R tidyverse 将整洁的表 例如下面的示例 转换为嵌套列表 使用一些 tidyverse 魔法 我能够将其转换为深度为三的嵌套列表 但我不知道如何将其嵌套得更深 采用以下示例输入 library tidyverse