Je voudrais sous-définir un data.frame avec une combinaison de ou/et. Ceci est mon code utilisant la fonction R normale.
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),]
Comment pourrais-je les convertir en utilisant la fonction de filtre dans le package dplyr? Merci pour toutes suggestions.
dplyr
solution:bibliothèque de chargement:
library(dplyr)
filtre avec condition comme ci-dessus:
df %>% filter(A == 1 & B == 3 | A == 3 & B ==2)
Vous pouvez utiliser subset()
et [
ainsi que. Voici différentes méthodes et leurs repères respectifs sur un ensemble de données plus large.
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
Intéressant. J'essayais de voir la différence en termes de jeu de données résultant et je ne pourrais pas avoir d'explication pour laquelle le bon vieux "[" opérateur s'est comporté différemment:
# 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