【问题标题】:R/data.table: separate columns and count occurrencesR/data.table:分隔列并计算出现次数
【发布时间】:2018-05-14 14:44:56
【问题描述】:

我有一个很大的data.table(这里只显示五行)。

 taxpath                                                                                                                  N
                  Bacteroidetes; Flavobacteriia; Flavobacteriales; Flavobacteriaceae; Formosa; Formosa sp. Hel3_A1_48;   57
 Bacteroidetes; Flavobacteriia; Flavobacteriales; Cryomorphaceae; NA; Cryomorphaceae bacterium BACL29 MAG-121220-bin8;   54
                Proteobacteria; Alphaproteobacteria; Pelagibacterales; Pelagibacteraceae; Candidatus Pelagibacter; NA;   53
                                                    Proteobacteria; Alphaproteobacteria; Pelagibacterales; NA; NA; NA;   41
                                                      Planctomycetes; NA; NA; NA; NA; Planctomycetes bacterium TMED84;   41

第一列是taxpath(从左到右的门、纲、目、科、属、种),第二列是N,每条税路出现的频率。

我想要做的是用分号分隔每个税收路径并使用第一个条目。

而且我想计算每个门等级(第一等级,因此是拟杆菌门、变形菌门或Planctomycetes)出现的频率。但是,这个数字应该乘以 N 列中的值。

所以,我所期望的或多或少是这样的。

phylum           Nnew
Bacteriodetes    111
Proteobacteria   94
Planctomycetes   41

你能帮我如何在列内进行拆分,并且 - 我想 - group-by 与列 N 相乘吗?

(PS:稍后,我也想对列税路径中的其他元素也这样做,但我认为将其分配到单独的表中更容易)

【问题讨论】:

  • 问题的第二部分不清楚。你能显示预期的
  • 例如,Proteobacteria 出现在两行(第 3 行和第 8 行)中。第 3 行的值为 53,第 8 行的值为 41。我期望的输出将是列 phylum 具有条目 proteobacteria,列 Nnew 具有值 94(53 +41)。我的意思清楚吗?
  • 能否请您查看更新后的代码
  • 基于示例,我得到 Bacteriodetes 为 326
  • 太好了,非常感谢。

标签: r data.table


【解决方案1】:

这标记为,所以这是一个简单的 data.table 解决方案。

library(data.table)
DT[, .(Nnew = sum(N)), by = sub(";.*", "", taxpath)]
#               sub Nnew
# 1:  Bacteroidetes  111
# 2: Proteobacteria   94
# 3: Planctomycetes   41

我们基本上对N 求和,同时在by 语句中动态提取taxpath 的第一部分


数据

DT <- fread("taxpath\t                                                                                                                  N
            Bacteroidetes; Flavobacteriia; Flavobacteriales; Flavobacteriaceae; Formosa; Formosa sp. Hel3_A1_48;\t   57
            Bacteroidetes; Flavobacteriia; Flavobacteriales; Cryomorphaceae; NA; Cryomorphaceae bacterium BACL29 MAG-121220-bin8;\t   54
            Proteobacteria; Alphaproteobacteria; Pelagibacterales; Pelagibacteraceae; Candidatus Pelagibacter; NA;\t   53
            Proteobacteria; Alphaproteobacteria; Pelagibacterales; NA; NA; NA;\t   41
            Planctomycetes; NA; NA; NA; NA; Planctomycetes bacterium TMED84;\t   41")

【讨论】:

    【解决方案2】:

    我们可以使用separate将'taxpath'根据分隔符;拆分成指定列,按'phylum'分组,得到'N'的sum

    library(tidyverse) 
    newcols <-c("phylum", "class", "order", "family", "genus", "species")
    df1 %>% 
       mutate(taxpath = sub(";$", "", taxpath)) %>%
       separate(taxpath, into = newcols, sep= ";\\s*") %>% 
       group_by(phylum) %>%
       summarise(Nnew = sum(N))
    # A tibble: 3 x 2
    #   phylum          Nnew
    #   <chr>          <int>
    # 1 Bacteroidetes    326
    # 2 Planctomycetes    41
    # 3 Proteobacteria    94
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多