valores valor sustituir quitar por perdidos omitir nulos filas eliminar detectar datos con cambiar r vector sum lapply cbind

sustituir - quitar valores perdidos en r



¿Es posible omitir los valores de NA en el operador "+"? (5)

Solo para laffs:

x=1:10 y=c(21:29, NA) "[<-"(x, is.na(x), 0) + "[<-"(y, is.na(y), 0) # [1] 22 24 26 28 30 32 34 36 38 10

lo que nuevamente ilustra el hecho de que todo en R es una función (y también muestra que el intérprete R es lo suficientemente inteligente como para convertir una cadena en una función cuando es necesario).

Sintácticamente edulcorado

na.zero <- function(x) { "[<-"(x, is.na(x), 0) } na.zero(x) + na.zero(y) # [1] 22 24 26 28 30 32 34 36 38 10

Versión más ampliamente aplicable:

na.replace <- function(x, value) { "[<-"(x, is.na(x), value) } na.replace(x, 1) * na.replace(x, 1) # [1] 1 4 9 16 25 36 49 64 81 100

Quiero calcular una ecuación en R. No quiero usar la función sum porque está devolviendo 1 valor. Quiero el vector completo de valores.

x = 1:10 y = c(21:29,NA) x+y [1] 22 24 26 28 30 32 34 36 38 NA x = 1:10 y = c(21:30) x+y [1] 22 24 26 28 30 32 34 36 38 40

Yo no quiero

sum(x,y, na.rm = TRUE) [1] 280

Lo cual no devuelve un vector.

Este es un ejemplo de juguete, pero tengo una ecuación más compleja que usa múltiples vectores de longitud 84647 elementos.

Aquí hay otro ejemplo de lo que quiero decir:

x = 1:10 y = c(21:29,NA) z = 11:20 a = c(NA,NA,NA,30:36) 5 +2*(x+y-50)/(x+y+z+a) [1] NA NA NA 4.388889 4.473684 4.550000 4.619048 4.681818 4.739130 NA


puedes usar ifelse()

x = 1:10 y = c(21:29,NA) x+y [1] 22 24 26 28 30 32 34 36 38 NA x + ifelse(is.na(y), 0, y) [1] 22 24 26 28 30 32 34 36 38 10


DATOS

x = 1:10 y = c(21:29,NA) x+y # [1] 22 24 26 28 30 32 34 36 38 NA

1

foo1 = function(...){ return(rowSums(cbind(...), na.rm = TRUE)) } foo1(x, y) # [1] 22 24 26 28 30 32 34 36 38 10

2

foo2 = function(...){ Reduce(''+'', lapply(list(...), function(x) replace(x, is.na(x), 0))) } foo2(x, y) # [1] 22 24 26 28 30 32 34 36 38 10


1)% +% Define un operador personalizado +:

`%+%` <- function(x, y) mapply(sum, x, y, MoreArgs = list(na.rm = TRUE)) 5 + 2 * (x %+% y - 50) / (x %+% y %+% z %+% a)

dando:

[1] 3.303030 3.555556 3.769231 4.388889 4.473684 4.550000 4.619048 4.681818 [9] 4.739130 3.787879

Aquí hay algunos ejemplos simples:

1 %+% 2 ## [1] 3 NA %+% 2 ## [1] 2 2 %+% NA ## [1] 2 NA %+% NA ## [1] 0

2) na2zero Otra posibilidad es definir una función que asigne NA a 0 de esta manera:

na2zero <- function(x) ifelse(is.na(x), 0, x) X <- na2zero(x) Y <- na2zero(y) Z <- na2zero(z) A <- na2zero(a) 5 + 2 * (X + Y - 50) / (X + Y + Z + A)

dando:

[1] 3.303030 3.555556 3.769231 4.388889 4.473684 4.550000 4.619048 4.681818 [9] 4.739130 3.787879

3) combinar arriba Una combinación que combina (1) con la idea en (2) es:

X <- x %+% 0 Y <- y %+% 0 Z <- z %+% 0 A <- a %+% 0 5 + 2 * (X + Y - 50) / (X + Y + Z + A)

4) clase numeric0 Podemos definir una clase personalizada "numeric0" con su propio operador +:

as.numeric0 <- function(x) structure(x, class = "numeric0") `+.numeric0` <- `%+%` X <- as.numeric0(x) Y <- as.numeric0(y) Z <- as.numeric0(z) A <- as.numeric0(a) 5 + 2 * (X + Y - 50) / (X + Y + Z + A)

Nota: Las entradas utilizadas fueron las de la pregunta, a saber:

x = 1:10 y = c(21:29,NA) z = 11:20 a = c(NA,NA,NA,30:36)


Usando rowSums :

Para ampliar mi comentario, puede concatenar los vectores y luego aplicar sus cálculos en la matriz resultante. Esta es la solución para el ejemplo que proporcionó al final de su pregunta;

5 + 2 * (rowSums(cbind(x,y), na.rm = T)-50)/(rowSums(cbind(x,y,z,a), na.rm = T)) # [1] 3.303030 3.555556 3.769231 4.388889 4.473684 4.550000 4.619048 4.681818 # [9] 4.739130 3.787879

Repetición de NA :

He visto soluciones aquí con la idea de reemplazar NA en los vectores; Creo que esto también sería útil:

y[is.na(y)] <- 0 #indexing NA values and replacing with zero