提问者:小点点

R/data. table:单独的列和计数出现次数


我有一个大的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

第一列是分类路径(门、类、目、科、属、种从左到右),第二列是N,每个分类路径发生的频率。

我想做的是用分号分割每个分类路径并使用第一个条目。

我想计算每个门等级(第一等级,即细菌、变形细菌或植物)出现的频率。然而,这个数字应该乘以N列中的值。

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

phylum           Nnew
Bacteriodetes    111
Proteobacteria   94
Planctomycetes   41

你能帮我如何在列中进行拆分,以及——我想——分组乘以列N吗?

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


共2个答案

匿名用户

这个标记了data. table,所以这里有一个简单的data.table解决方案。

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

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

数据

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")

匿名用户

我们可以使用分离根据分隔符将“分类路径”拆分为指定的列;,按“门”分组,得到“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