【问题标题】:manipulating all the tables in an R group_split list操作 R group_split 列表中的所有表
【发布时间】:2021-06-07 16:07:59
【问题描述】:

已编辑

我有一张大桌子,开头是这样的

本质上,它是一个包含多个样本(“samp_id”)的表格,显示每个样本中存在的“分类单元”的数量(“最少”)。

我想转置/旋转表格,使其看起来像这样;

即将“分类单元”作为第一行,“数据”中的 90 个样本中的每一个作为基于“最小”列的一行,并用其“samp_id”重新命名。所以你会看到每个样本是什么,以及不同“分类单元”中每个样本的“最小”值(在 90 个样本中可能不相同)。

以前,我根据“samp_id”将数据分成多个小标题,选择“分类单元”和“最少”,用“samp_id”重命名“最少”,然后将基于“分类单元”的单个小标题与full_join 使用类似下面的代码,然后转置组合表

ACLOD_11 = data %>%
  filter(samp_id == "ACLOD_11") %>%
  select(taxon, least) %>%
  rename("ACLOD_11" = least) 

ACLOD_12 = data ... #as above, but different samp_id

data_final = list(ACLOD_11, ACLOD_12, ...) %>% 
  reduce(full_join, by = "taxon")

因为在这个包含 90 个样本的数据表之后我有更多的数据表要跟进,所以我希望能够做到这一点,而不必在加入之前将数据单独分成 100 个小标题并手动输入“samp_id”。

我目前已根据“samp_id”将数据拆分为 90 个单独的小标题(“数据”中有 90 个样本)

data_split = data %>%
  group_split(samp_id) 

但我不确定这是否是最好的方法,或者我下一步应该做什么?

【问题讨论】:

  • 这听起来有点像“从长到宽”的问题。您是否考虑过在“samp_id”、“least”和“taxon”列上使用tidyr::pivot_wider() 之类的东西?如果事情非常大并且您需要一些速度,您可以尝试data.table::dcast() 扩大。
  • 谢谢你,快接近了;我已经编辑了这个问题(希望!)增加更多清晰度,不胜感激!
  • 如果您只选择与问题相关的三列(samp_id、least、taxon),tidyr::pivot_wider(data, names_from = "taxon", values_from = "least") 会让您接近吗?如果您希望人们进行测试,请尝试添加一些我们可以复制和粘贴的数据,而不是屏幕截图。 :) 关于如何做到这一点的一些想法here
  • 成功了,感谢您的帮助! - 是的,我知道最好提供一个示例数据,以便其他人可以测试代码:)

标签: r dplyr


【解决方案1】:

我们可以使用

library(dplyr)
library(purrr)
data %>%
     split(.$samp_id) %>%
     imap(~ .x %>%
              select(taxon, least) %>%
              rename(!!.y := least)) %>%
      reduce(full_join, by = 'taxon')

【讨论】:

  • 谢谢 - 我已经尝试过了,但出现以下错误;有没有解决的办法? “错误:无法分配大小为 1.0 Gb 的向量”
  • @Maho 与代码无关。这是你没有的记忆。也许在新会话中使用 tyr 或使用具有内存的集群
猜你喜欢
  • 2020-05-27
  • 1970-01-01
  • 2017-09-03
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多