R:过滤具有至少一个特定值的行

时间:2018-06-29 11:46:04

标签: r dataframe filter conditional-statements any

在R中,我有一个这样的数据框。

df
    Tour    Order   Machine    Company
[1]    A        D         D          B
[2]    B        B         A          G
[3]    A        E         B          A
[4]    C        B         C          B
[5]    A        G         G          C

我想获取三列TourOrder Machine包含至少一个D EG的行。

结果应为:

    Tour    Order   Machine    Company
[1]    A        D         D          B
[3]    A        E         B          A
[5]    A        G         G          C

我的尝试

df %>%
    filter(any(c(Tour, Order, Machine) %in% c('D', 'E', 'G')))

但是它不能正确过滤(返回所有行)。有人可以帮我吗?

5 个答案:

答案 0 :(得分:5)

使用tidyverse的另一种filter_at方法

df %>% filter_at(vars(-Company), any_vars(. %in% c("D", "E", "G")))
#  Tour Order Machine Company
#1    A     D       D       B
#2    A     E       B       A
#3    A     G       G       C

答案 1 :(得分:3)

另一个选择:

df[rowSums(sapply(df[-4], '%in%', c('D', 'E', 'G'))) > 0,]

结果:

  Tour Order Machine Company
1    A     D       D       B
3    A     E       B       A
5    A     G       G       C

使用dplyr,您应该添加rowwise()

df %>%
  rowwise() %>% 
  filter(any(c(Tour, Order, Machine) %in% c('D', 'E', 'G')))

答案 2 :(得分:1)

ind <- apply(sapply(df1[c("Tour","Order","Machine")],`%in%`,c('D', 'E', 'G')),1,any)
df1[ind,]
#   Tour Order Machine Company
# 1    A     D       D       B
# 3    A     E       B       A
# 5    A     G       G       C
  • sapply将返回一个布尔矩阵,其中包含每个单元格的匹配项。
  • apply将检查其中是否有TRUE,这意味着您要保留该行
  • 我们过滤输入

dplyr版本:

df1 %>%
  filter_at(c("Tour","Order","Machine"),any_vars(.%in% c('D', 'E', 'G')))
#   Tour Order Machine Company
# 1    A     D       D       B
# 2    A     E       B       A
# 3    A     G       G       C

数据

df1 <- read.table(header=TRUE,stringsAsFactors=FALSE,text="
 Tour    Order   Machine    Company
    A        D         D          B
    B        B         A          G
    A        E         B          A
    C        B         C          B
    A        G         G          C")

答案 3 :(得分:1)

您可以在列上lapply进行匹配检查,然后使用Reduce(或)|选择是否存在匹配项。

df[Reduce('|', lapply(df[-4], '%in%', c('D', 'E', 'G'))),]

答案 4 :(得分:0)

使用基数R:

df1[grepl("[DEG]",do.call(paste,df1[-4])),]# YOU CAN USE "D|E|G"

  Tour Order Machine Company
1    A     D       D       B
3    A     E       B       A
5    A     G       G       C