使用有序因子过滤大数据集,条件是R中的其他值与dplyr?

时间:2016-07-15 14:15:44

标签: r dplyr

我的数据框(bact)有~4500行(细菌分类群)和19个有用的列(主要是样本)。这是基因组学数据的输出,其中包含rankID信息(有序因子)和多个样本列中的基因匹配(p' x'),以及具有跨分类群(总数)的基因匹配总和的列。我打算转型为“长期'格式化后我做了一些清理行。

问题是:有许多重叠的分类群(未分类的较高级分类群,具有分类(名称)的较低级分类群)以及下游数据分析和绘图的目标是与数据相关的系统发育相关的分类群描述(在这种情况下是基因匹配)。

例如

 rankID             taxon           total    
 0.2.1              Acidobacteria   994577
 0.2.1.1            Acidobacteria   917570
 0.2.1.1.1          11B-2           3
 0.2.1.1.1.1        unclassified    3
 0.2.1.1.1.1.1      unclassified    3
 0.2.1.1.2          AT-s3-28        2975
 0.2.1.1.2.1        unclassified    2975
 0.2.1.1.2.1.1      unclassified    2975

我想删除'总计'中具有相同值的所有行列和更高级别的排名ID' (在这种情况下:0.2.1.1.1; 0.2.1.1.1.1; 0.2.1.1.2.1; 0.2.1.1.2.1.1)。 注意:我不想删除所有未分类的'在分类单元中,因为有时这些实际上是必要的。

以下是我认为可行的方法:

bact<- read.csv('cSSU_bacteria_full.csv')
str(bact)
bact$rankID <- factor(bact$rankID, ordered = TRUE)

library(dplyr)

bact %>%
   filter(!(any(order(levels(rankID)) < order(levels(rankID)) & total == total)))

目标是删除多余的行,在总数相等时保留最低级别的分类,因此删除相互解释的分类群,但一个分类(有名称)而其他分类不分。

提前致谢。

1 个答案:

答案 0 :(得分:0)

rankID有两个组成部分。第一个是rankID是多长时间。例如,第二行的字符串长度为7.我们可以将此用作我们的优势。根据您的上述数据,具有最高字符数的总金额是最低排名。

另一个组成部分是rankID中数字的总和。没有等级具有相同的字符长度和相同的数字总和。幸运的是,要做到这一点,我们只需要字符串长度。

但是,要做到这一点,您需要确保rankID实际上是一个字符串而不是一个因素。

bact %>% 
mutate(StringLength = nchar(rankID, type = 'char')) %>%
group_by(total) %>%
filter(StringLength == max(StringLength))

这应该可以解决问题。