Перезапись сводного широкого стола - PullRequest
2 голосов
/ 09 апреля 2020

У меня есть следующий фрейм данных:

df <- structure(list(rows = c(1, 2, 3, 4, 5, 6), col1 = c(122, 111, 
111, 222, 212, 122), col2 = c(10101, 20202, 200022, 10201, 20022, 
22222), col3 = c(11, 22, 22, 22, 11, 22)), class = "data.frame", row.names = c(NA, 
-6L))

  rows col1   col2 col3
1    1  122  10101   11
2    2  111  20202   22
3    3  111 200022   22
4    4  222  10201   22
5    5  212  20022   11
6    6  122  22222   22

Я хотел бы отфильтровать строки, в которых хотя бы один из столбцов 2,3,4 содержит «1» И «2».

Желаемый результат будет:

  rows col1  col2 col3
1    1  122 10101   11
4    4  222 10201   22
5    5  212 20022   11
6    6  122 22222   22

Следующие два не работают, потому что они сканируют все три столбца вместе, а не один за другим.

df[which(apply(df[,2:4],1,function(x) any(grepl("1",x)) & any(grepl("2",x)))),]

ИЛИ

library(tidyverse)
TRIPS2_fin %>% filter_at(vars(2,3,4), any_vars(str_detect(., pattern="1|2")))

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Мы можем векторизовать его в base R

df[Reduce(`|`, lapply(df[2:4], grepl, pattern = '1.*2|2.*1')),]
#  rows col1  col2 col3
#1    1  122 10101   11
#4    4  222 10201   22
#5    5  212 20022   11
#6    6  122 22222   22
1 голос
/ 09 апреля 2020

Вы можете использовать:

df[apply(df[2:4], 1, function(x) any(grepl('1.*2|2.*1', x))),]

#  rows col1  col2 col3
#1    1  122 10101   11
#4    4  222 10201   22
#5    5  212 20022   11
#6    6  122 22222   22

и аналогичные, используя filter_at

library(dplyr)
df %>%  filter_at(2:4, any_vars(grepl('1.*2|2.*1', .)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...