2015-03-09

Project Euler - Problema 1 en R

Title Una manera de aprender R es tratar de resolver problemas planteados en Project Euler. Aunque enfocados a resolver problemas matemáticos, podremos aplicar los conceptos o funciones aprendidos en otros problemas prácticos. Una vez resueltos, tendremos acceso al foro donde podremos aprender de las soluciones de otros participantes.

Problema

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.

Si listamos todos los números naturales por debajo de 10, que son múltiplos de 3 o 5, se obtiene 3 , 5, 6 y 9. La suma de estos múltiplos es 23. Encuentra la suma de todos los múltiplos de 3 o 5 por debajo de 1.000.

Solución

x <- 1:999
sum(x[x%%3 == 0 | x%%5 == 0]) 
Mediante un data frame

# En 4 líneas
x <- seq(999, 1)  # Secuencia
y <- x%%3 == 0  # Divisible por 3
z <- x%%5 == 0  # Divisible por 5
df <- data.frame(x, y, z)  # Creamos data frame
sum(subset(df, y == TRUE | z == TRUE)$x)  # Cálculo final
# En 2 líneas
df <- data.frame(x = 1:999, 
                 y = 1:999%%3 == 0, 
                 z = 1:999%%5 == 0)
sum(subset(df, y == TRUE | z == TRUE)$x)
# Selección sin la función subset
sum(df[y == TRUE | z == TRUE, ]$x)
sum(df[y %in% TRUE | z %in% TRUE, ]$x)
Con dplyr

library(dplyr)
# Data frame
df <- data.frame(x = 1:999, 
                 y = 1:999%%3 == 0, 
                 z = 1:999%%5 == 0)
# Tres opciones de selección:
sum(filter(df, y == TRUE | z == TRUE)$x)
summarise(filter(df, y == TRUE | z == TRUE), sum(x))
filter(df, y == TRUE | z == TRUE) %>% summarise(sum(x)) 
[1] 233168

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos