фильтровать строки, если какой-либо из двух столбцов имеет указанное значение - PullRequest
1 голос
/ 31 января 2020

У меня есть фрейм данных с 7 столбцами, скажем, a1, a2, ...., a7. a1 и a2 имеют числовые значения c, а остальные имеют строки (имена спортсменов в данном случае). Я хочу выбрать строки, в которых «Джон» и «Петр» появляются вместе в любых двух столбцах (от a3 до a7). В приведенном ниже примере я хочу выбрать только строки 2 и 4.

Пример

enter image description here.

Я искал по всему inte rnet, но не могу найти направление. У кого-нибудь есть идеи? Это выполнимо? спасибо!

Ответы [ 3 ]

2 голосов
/ 31 января 2020
library(tidyverse)
df <- data.frame(
  a1 = c(14,23,24,6,4),
  a2 = c(5,67,4,57,54),
  a3 = c("Paul", "John", "Mike", "Peter", "John"),
  a4 = c("John", "Phil", "Peter", "John", "Luke"),
  a5 = c("Dave", "Peter", "Nick", "Paul", "Phil"),
  a6 = c("Adrian", "Keim", "Rick", "Luke", "Mike"),
  a7 = c("Rick", "Luke", "Adrian", "Rick", "Dave")
)

df %>%
  filter_all(
    any_vars(. == "Peter")
  ) %>%
  filter_all(
    any_vars(. == "John")
  )
1 голос
/ 31 января 2020

Если ваш фрейм данных называется df, вы можете сделать

cols <- 3:7
df[rowSums(df[cols] == 'John') > 0 & rowSums(df[cols] == 'Peter') > 0, ]

ИЛИ с apply

subset(df, apply(df[cols], 1, function(x) all(c('John', 'Peter') %in% x)))
0 голосов
/ 31 января 2020

Вот еще одно базовое решение R путем определения вашей пользовательской функции f в качестве фильтра, т. Е.

f <- Vectorize(function(pat) grepl(pat,do.call(paste,df)))
dfout <- subset(df,do.call(`&`,data.frame(f(c("\\bJohn\\b","\\bPeter\\b")))))

, такой что

> dfout
  a1 a2    a3   a4    a5   a6   a7
2 23 67  John Phil Peter Keim Luke
4  6 57 Peter John  Paul Luke Rick

DATA

df <- structure(list(a1 = c(14, 23, 24, 6, 4), a2 = c(5, 67, 4, 57, 
54), a3 = structure(c(3L, 1L, 2L, 4L, 1L), .Label = c("John", 
"Mike", "Paul", "Peter"), class = "factor"), a4 = structure(c(1L, 
4L, 3L, 1L, 2L), .Label = c("John", "Luke", "Peter", "Phil"), class = "factor"), 
    a5 = structure(c(1L, 4L, 2L, 3L, 5L), .Label = c("Dave", 
    "Nick", "Paul", "Peter", "Phil"), class = "factor"), a6 = structure(c(1L, 
    2L, 5L, 3L, 4L), .Label = c("Adrian", "Keim", "Luke", "Mike", 
    "Rick"), class = "factor"), a7 = structure(c(4L, 3L, 1L, 
    4L, 2L), .Label = c("Adrian", "Dave", "Luke", "Rick"), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...