我有一个大的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:稍后,我想对列分类路径中的其他元素也这样做,但我认为将其分布到单独的表中更容易)
这个标记了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