过滤_at()不使用-STARTS_WITH() [英] Filter_at() not working with -starts_with()

查看:31
本文介绍了过滤_at()不使用-STARTS_WITH()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含多个样本(列)和变量(行)的数据集。我想用过滤出一个数据集,以确定特定样本集唯一的变量。

这是示例数据框

dput(df)
structure(list(Description=c("k__Bacteria;__;__;__;__","k__Bacteria;p__Acidobacteria;c__[Chloracidobacteria];o__RB41;f__Ellin6075", 
"k__Bacteria;p__Acidobacteria;c__Acidobacteriia;o__Acidobacteriales;f__Koribacteraceae", 
"k__Bacteria;p__Acidobacteria;c__DA052;o__Ellin6513;f__", "k__Bacteria;p__Acidobacteria;c__Solibacteres;o__Solibacterales;f__", 
"k__Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__", 
"k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__", 
"k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Actinomycetaceae", 
"k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Actinopolysporaceae", 
"k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Corynebacteriaceae"
), ADZU.3 = c(2651L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 12L), ADZU.4 = c(2439L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 5L), BEP.3 = c(11452L, 9L, 5L, 
0L, 0L, 6L, 14L, 0L, 0L, 83L), BEP.4 = c(4168L, 0L, 0L, 9L, 3L, 
0L, 0L, 5L, 6L, 61L), Hya.1 = c(15179L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 94L), Hya.2 = c(4525L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
34L)), row.names = c(NA, 10L), class = "data.frame")

我在dyplr中使用过滤_at()函数,并且有一段代码可以正常工作。下面,我有许多以不同字母A、B、H等开头的示例。我想查找对于以相同字母(例如字母B)开头的示例唯一的变量。

我有一个当前运行良好的代码

##code set 1, this code works

df.bep<-filter_at(df,vars(starts_with("A"),starts_with("H")), 
all_vars(.==0))

此代码的结果如下所示,这是我预期看到的结果:

dput(df.bep)
structure(list(Description = c("k__Bacteria;p__Acidobacteria;c__[Chloracidobacteria];o__RB41;f__Ellin6075", 
"k__Bacteria;p__Acidobacteria;c__Acidobacteriia;o__Acidobacteriales;f__Koribacteraceae", 
"k__Bacteria;p__Acidobacteria;c__DA052;o__Ellin6513;f__", "k__Bacteria;p__Acidobacteria;c__Solibacteres;o__Solibacterales;f__", 
"k__Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__", 
"k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__", 
"k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Actinomycetaceae", 
"k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Actinopolysporaceae"
), ADZU.3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), ADZU.4 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L), BEP.3 = c(9L, 5L, 0L, 0L, 6L, 14L, 
0L, 0L), BEP.4 = c(0L, 0L, 9L, 3L, 0L, 0L, 5L, 6L), Hya.1 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L), Hya.2 = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L)), row.names = c(NA, -8L), class = "data.frame")

这个问题是,对于包含许多不同样本的较长数据集,为过滤_at()指定我想要的每个样本的每个字母开始变得很麻烦。

我将脚本修改为使用-starts_with()尝试过滤数据框,方法是排除以我不想过滤的特定字母开头的样本(例如过滤除以字母B开头的样本外的所有样本),例如:

df.bep.2<-filter_at(df,vars(-starts_with("B")),all_vars(.==0))
但是,这第二组代码不能按预期工作。我没有收到任何错误,但我得到的是一个空数据框

dput(df.bep.2)
structure(list(Description = character(0), ADZU.3 = integer(0), 
ADZU.4 = integer(0), BEP.3 = integer(0), BEP.4 = integer(0), 
Hya.1 = integer(0), Hya.2 = integer(0)), row.names = c(NA, 
0L), class = "data.frame")

组合过滤_at()和-starts_with()时,是否需要在代码中添加其他内容?

推荐答案

这表示all_vars中的条件在不是以"A"开头的列中不满足。该过滤正在搜索所有不以A开头的列,并且只选择包含所有0的行。

例如,mtcarsDataSet在此条件下不会返回任何内容:

mtcars %>%
  filter_at(vars(-starts_with("q")), all_vars(. == 0))

 [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
<0 rows> (or 0-length row.names)

除非我们添加只有0的行(尽管qsec列可以有非零值):

mtcars %>%
  bind_rows(setNames(rep(0, ncol(.)), names(.))) %>%
  filter_at(vars(-starts_with("q")), all_vars(. == 0))

  mpg cyl disp hp drat wt qsec vs am gear carb
1   0   0    0  0    0  0    0  0  0    0    0

编辑:对于您的特定问题,是因为Description列没有== 0。可能有几种解决方案,但下面的两种应该适合您!

df1 %>%
  filter_at(vars(-starts_with("B"), -one_of("Description")), all_vars(. == 0))

df1 %>%
  filter_if(sapply(., is.numeric) & !startsWith(names(.), "B"), all_vars(. == 0))

这篇关于过滤_at()不使用-STARTS_WITH()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆