Ответ 1
dplyr
решение:
Загрузите библиотеку:
library(dplyr)
с условием, как указано выше:
df %>% filter(A == 1 & B == 3 | A == 3 & B ==2)
Я хотел бы подмножить data.frame с комбинацией или/и. Это мой код, используя обычную функцию R.
df <- expand.grid(list(A = seq(1, 5), B = seq(1, 5), C = seq(1, 5)))
df$value <- seq(1, nrow(df))
df[(df$A == 1 & df$B == 3) |
(df$A == 3 & df$B == 2),]
Как мне преобразовать их с помощью функции фильтра в пакет dplyr? Спасибо за любые предложения.
dplyr
решение:Загрузите библиотеку:
library(dplyr)
с условием, как указано выше:
df %>% filter(A == 1 & B == 3 | A == 3 & B ==2)
Вы можете использовать subset()
и [
. Вот несколько разных методов и их соответствующие критерии для большего набора данных.
df <- expand.grid(A = 1:100, B = 1:100, C = 1:100)
df$value <- 1:nrow(df)
library(dplyr); library(microbenchmark)
f1 <- function() subset(df, A == 1 & B == 3 | A == 3 & B == 2)
f2 <- function() filter(df, A == 1 & B == 3 | A == 3 & B == 2)
f3 <- function() df[with(df, A == 1 & B == 3 | A == 3 & B == 2), ]
f4 <- function() df[(df$A == 1 & df$B == 3) | (df$A == 3 & df$B == 2),]
microbenchmark(subset = f1(), filter = f2(), with = f3(), "$" = f4())
# Unit: milliseconds
# expr min lq mean median uq max neval
# subset 47.42671 49.99802 75.95385 92.24430 96.05960 141.2964 100
# filter 36.94019 38.77325 60.22831 42.64112 84.35896 155.0145 100
# with 38.90918 44.36299 71.29214 86.39629 88.89008 134.7670 100
# $ 40.22723 44.08606 71.32186 86.71372 89.59275 133.1132 100
Интересно. Я пытался увидеть разницу в результирующем наборе данных, и я не могу объяснить, почему старый добрый оператор "[" вел себя по-другому:
# Subset for year=2013
sub<-brfss2013 %>% filter(iyear == "2013")
dim(sub)
#[1] 486088 330
length(which(is.na(sub$iyear))==T)
#[1] 0
sub2<-filter(brfss2013, iyear == "2013")
dim(sub2)
#[1] 486088 330
length(which(is.na(sub2$iyear))==T)
#[1] 0
sub3<-brfss2013[brfss2013$iyear=="2013", ]
dim(sub3)
#[1] 486093 330
length(which(is.na(sub3$iyear))==T)
#[1] 5
sub4<-subset(brfss2013, iyear=="2013")
dim(sub4)
#[1] 486088 330
length(which(is.na(sub4$iyear))==T)
#[1] 0