Filter_at() 不适用于 -starts_with()
Filter_at() not working with -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 中使用 filter_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")
这个问题是,对于包含许多不同样本的较长数据集,为我想要 filter_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")
组合 filter_at() 和 -starts_with() 时,我需要在代码中添加一些额外的东西吗?
这意味着您在 all_vars
中的条件在不以 "A"
开头的列中不满足。该过滤器正在搜索所有不以 A 开头的列,并且只选择包含所有 0
的行。
例如,mtcars
数据集将不会 return 具有此条件的任何内容:
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))
我有一个包含多个样本(列)和变量(行)的数据集。我想过滤掉一个数据集以确定特定样本集所特有的变量。
这是示例数据框
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 中使用 filter_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")
这个问题是,对于包含许多不同样本的较长数据集,为我想要 filter_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")
组合 filter_at() 和 -starts_with() 时,我需要在代码中添加一些额外的东西吗?
这意味着您在 all_vars
中的条件在不以 "A"
开头的列中不满足。该过滤器正在搜索所有不以 A 开头的列,并且只选择包含所有 0
的行。
例如,mtcars
数据集将不会 return 具有此条件的任何内容:
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))