R: фильтровать строки, которые имеют хотя бы одно из определенных значений - PullRequest
0 голосов
/ 29 июня 2018

В 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

Я хочу получить строки, в которых три столбца Tour, Order Machine содержат хотя бы один D E или G.

Результат должен быть:

    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 голосов
/ 30 июня 2018

с использованием базы 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
0 голосов
/ 29 июня 2018

Вы можете lapply над столбцами, чтобы проверить совпадения, затем Reduce, используя | (или), чтобы выбрать, есть ли совпадения.

df[Reduce('|', lapply(df[-4], '%in%', c('D', 'E', 'G'))),]
0 голосов
/ 29 июня 2018

Другой вариант:

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')))
0 голосов
/ 29 июня 2018

Другой 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
0 голосов
/ 29 июня 2018
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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...