【问题标题】:dply filter with exceptiondplyr 过滤器异常
【发布时间】:2018-01-06 17:28:57
【问题描述】:

所以我试图过滤掉我的数据集中的某些东西。

这是我的数据集的一个非常精简的示例:

fish <- data.frame ("order"=c("a", "a", "a", "b", "b", "c", "c", "d", "d", "e", "e"), 
                "family"= c("r", "s", "t", "r", "y", "y", "y", "u", "y", "u", "y"), 
              "species"=c(7, 8, 9, 6, 5, 4, 3, 10, 1, 11, 2))

所以我有

fish <- fish%>%
  filter(
!(order %in% c("a", "b", "c"))&
!(family %in% c("r","s","t","u"))
)

应该删除 a,b,c 中的所有订单以及 , r, s, t, u 中的所有族。离开我

order    family    species
d         y         10
e         y         11

但问题是,我要过滤掉科中的两个物种。所以说物种1在家庭“r”中。我希望物种 1 留在数据集中,同时过滤家庭 r 的所有其余部分。所以我希望输出看起来像:

order    family    species
d         y         10
e         y         11
d         r         1
e         r         2

我如何确保在过滤掉家庭组时,保留这两个物种?

谢谢!

【问题讨论】:

  • 我猜“Scorpaenichthys marmoratus”是 Scorpaenidae-family 中一个物种的属种名称(也许“Ophidiiformes”是“Ophiodon elongatus”的顺序?)。如果是这样的话,你对你的观众的期望太高了。这里的大多数读者都没有生物学系统发育学方面的丰富背景。您应该构建一个更通用的示例,其中包括定义具有所有这些树功能的fish 数据对象。还要明确“排除把这些东西拿出来”这个短语中的双重否定结构是否真的意味着“保留这些物品”。
  • 最干净的代码(不一定是最短的)是执行第二个过滤器(species %in% (c(......)) 并通过 bind_rows 组合两个数据帧。
  • 我要等一两个小时才能投票结束这个问题,因为它不清楚,但我希望通过编辑来澄清问题并构建一个可能包含包含的完整示例dput(head(fish))的输出
  • 在没有看到您的数据和预期输出的情况下很难确定,但可能类似于:filter(!(family %in% c("r","s","t","u")) | species %in% 1:2)

标签: r filter dplyr


【解决方案1】:

您可以 rbind 三个单独过滤器的结果:

temp1<-filter(fish,order!=c("a","b","c")&family!=c("r","s","t","u"))

temp2<-filter(fish,family=="r"&species==1)

temp3<-filter(fish,family=="s"&species==2)

fish<-rbind(temp1,temp2,temp3)

rm(temp1,temp2,temp3)

【讨论】:

  • 不用担心;研究愉快!
【解决方案2】:

让过滤过程反映您的逻辑是最自然的 --

过滤器#1:过滤掉不受欢迎的orderfamily
过滤器#2:过滤可取的familyspecies

注意:我必须更改您的 familyspecies 配对条件才能获得匹配项。

library(dplyr)
library(purrr)

# your example data
fish <- tibble ("order"=c("a", "a", "a", "b", "b", "c", "c", "d", "d", "e", "e"), 
                "family"= c("r", "s", "t", "r", "y", "y", "y", "u", "y", "u", "y"), 
                "species"=c(7, 8, 9, 6, 5, 4, 3, 10, 1, 11, 2))

# put filter criteria in variables
order_filter <- c('a', 'b', 'c')
family_filter <- c('r', 's', 't', 'u')

# Filter 1
df1 <- fish %>%
  filter(!order %in% order_filter,
         !family %in% family_filter)

# Filter 2
df2 <- map_df(.x = list(c('r', 7), c('s', 8)),
              .f = function(x) {fish %>%
                  filter(family == x[1], species == x[2])})

# Combine two data frames created by Filter 1 and Filter 2
df_final <- bind_rows(df1, df2)
print(df_final)

#  A tibble: 4 x 3
#      order family species
#     <chr>  <chr>   <dbl>
# 1     d      y       1
# 2     e      y       2
# 3     a      r       7
# 4     a      s       8

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2011-05-15
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多