studio reemplazar funcion filtrar eliminar datos data agrupar r dplyr

reemplazar - funcion select en r



Establecer ciertos valores a NA con dplyr (3)

Estoy tratando de encontrar una manera simple de hacer algo como esto con dplyr (conjunto de datos = dat, variable = x):

day$x[dat$x<0]=NA

Debería ser simple pero esto es lo mejor que puedo hacer en este momento. hay una manera mas facil?

dat = dat %>% mutate(x=ifelse(x<0,NA,x))


Puedes usar replace que es un poco más rápido que ifelse :

dat <- dat %>% mutate(x = replace(x, x<0, NA))

Puede acelerarlo un poco más al proporcionar un índice para replace utilizando:

dat <- dat %>% mutate(x = replace(x, which(x<0L), NA))

En mi máquina, esto reduce el tiempo a un tercero, ver más abajo.

Aquí hay una pequeña comparación de las diferentes respuestas, lo cual es solo indicativo, por supuesto:

set.seed(24) dat <- data.frame(x=rnorm(1e6)) system.time(dat %>% mutate(x = replace(x, x<0, NA))) User System elapsed 0.03 0.00 0.03 system.time(dat %>% mutate(x=ifelse(x<0,NA,x))) User System elapsed 0.30 0.00 0.29 system.time(setDT(dat)[x<0,x:=NA]) User System elapsed 0.01 0.00 0.02 system.time(dat$x[dat$x<0] <- NA) User System elapsed 0.03 0.00 0.03 system.time(dat %>% mutate(x = "is.na<-"(x, x < 0))) User System elapsed 0.05 0.00 0.05 system.time(dat %>% mutate(x = NA ^ (x < 0) * x)) User System elapsed 0.01 0.00 0.02 system.time(dat %>% mutate(x = replace(x, which(x<0), NA))) User System elapsed 0.01 0.00 0.01

(Estoy usando dplyr_0.3.0.2 y data.table_1.9.4)

Dado que siempre estamos muy interesados ​​en la evaluación comparativa, especialmente en el curso de los debates de data-table-vs-dplyr, proporciono otra referencia de 3 de las respuestas utilizando microbenchmark y los datos de akrun. Tenga en cuenta que modifiqué dplyr1 para que sea la versión actualizada de mi respuesta:

set.seed(285) dat1 <- dat <- data.frame(x=sample(-5:5, 1e8, replace=TRUE), y=rnorm(1e8)) dtbl1 <- function() {setDT(dat)[x<0,x:=NA]} dplr1 <- function() {dat1 %>% mutate(x = replace(x, which(x<0L), NA))} dplr2 <- function() {dat1 %>% mutate(x = NA ^ (x < 0) * x)} microbenchmark(dtbl1(), dplr1(), dplr2(), unit=''relative'', times=20L) #Unit: relative # expr min lq median uq max neval # dtbl1() 1.091208 4.319863 4.194086 4.162326 4.252482 20 # dplr1() 1.000000 1.000000 1.000000 1.000000 1.000000 20 # dplr2() 6.251354 5.529948 5.344294 5.311595 5.190192 20


Puedes usar la función is.na<-

dat %>% mutate(x = "is.na<-"(x, x < 0))

O puedes usar operadores matemáticos:

dat %>% mutate(x = NA ^ (x < 0) * x)


Si está utilizando data.table , el código de abajo es más rápido

library(data.table) setDT(dat)[x<0,x:=NA]

Puntos de referencia

Usando data.table_1.9.5 y dplyr_0.3.0.9000

library(microbenchmark) set.seed(285) dat <- data.frame(x=sample(-5:5, 1e7, replace=TRUE), y=rnorm(1e7)) dtbl1 <- function() {as.data.table(dat)[x<0,x:=NA]} dplr1 <- function() {dat %>% mutate(x = replace(x, x<0, NA))} microbenchmark(dtbl1(), dplr1(), unit=''relative'', times=20L) #Unit: relative #expr min lq mean median uq max neval cld #dtbl1() 1.00000 1.000000 1.000000 1.000000 1.000000 1.000000 20 a #dplr1() 2.06654 2.064405 1.927762 1.795962 1.881821 1.885655 20 b

Puntos de referencia actualizados

Utilizando data.table_1.9.5 y dplyr_0.4.0 . Utilicé un conjunto de datos un poco más grande y lo reemplacé as.data.table con setDT (también se incluye la función más rápida de @Sven Hohenstein).

set.seed(285) dat <- data.frame(x=sample(-5:5, 1e8, replace=TRUE), y=rnorm(1e8)) dat1 <- copy(dat) dtbl1 <- function() {setDT(dat)[x<0,x:=NA]} dplr1 <- function() {dat1 %>% mutate(x = replace(x, x<0, NA))} dplr2 <- function() {dat1 %>% mutate(x = NA ^ (x < 0) * x)} microbenchmark(dtbl1(), dplr1(), dplr2(), unit=''relative'', times=20L) #Unit: relative # expr min lq mean median uq max neval cld #dtbl1() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 20 a #dplr1() 2.523945 2.542412 2.536255 2.579379 2.518336 2.486757 20 b #dplr2() 1.139216 1.089992 1.088753 1.058653 1.093906 1.100690 20 a

Puntos de referencia actualizados2

A petición de @docendo discimus, vuelve a evaluar su "nueva" versión de dplyr usando data.table_1.9.5 y dplyr_0.4.0 .

NOTA: Debido a que hay un cambio en el código discocus de @docendo, cambié 0 a 0L para la tabla de datos.

set.seed(285) dat <- data.frame(x=sample(-5:5, 1e8, replace=TRUE), y=rnorm(1e8)) dat1 <- copy(dat) dtbl1 <- function() {setDT(dat)[x<0L, x:= NA]} dplr1 <- function() {dat1 %>% mutate(x = replace(x, which(x<0L), NA))} dplr2 <- function() {dat1 %>% mutate(x = NA ^ (x < 0) * x)} microbenchmark(dtbl1(), dplr1(), dplr2(), unit=''relative'', times=20L) #Unit: relative #expr min lq mean median uq max neval cld #dtbl1() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 20 a #dplr1() 2.186055 2.183432 2.142293 2.222458 2.194450 1.442444 20 b #dplr2() 2.919854 2.925795 2.852528 2.942700 2.954657 1.904249 20 c

datos

set.seed(24) dat <- data.frame(x=sample(-5:5, 25, replace=TRUE), y=rnorm(25))