2016-09-21

Problema del conjunto de cobertura en R

Title

Problema

Queremos resolver el problema del conjunto de cobertura en R. Calcular el número mínimo de conjuntos necesarios que contenga todos los elementos del universo. En nuestro ejemplo el universo es U = {1, 2, 3, 4, 5} y los conjuntos son s1 = {1, 2, 3}, s2 = {2, 4}, s3 = {3, 4}, s4 = {4, 5}.

  sets n
1   s1 1
2   s1 2
3   s1 3
4   s2 2
5   s2 4
6   s3 3
7   s3 4
8   s4 4
9   s4 5

df <- structure(list(sets = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L), .Label = c("s1", "s2", "s3", "s4"), class = "factor"), 
    n = c(1, 2, 3, 2, 4, 3, 4, 4, 5)), .Names = c("sets", "n"
), row.names = c(NA, -9L), class = "data.frame")

Solución

En nuestro ejemplo la solución es obvia, los conjuntos s1 y s4 serían el número de conjuntos mínimo necesario. Sin embargo, deseamos implementarlo en R para ser capaces de resolver problemas que comprendan miles de conjuntos con miles de elementos dentro de cada uno.

# El universo, elementos únicos de todos los conjuntos.
unique(df$n)
[1] 1 2 3 4 5
Empleamos el paquete lpSolve para resolver problemas de programación lineal.

# Creamos una representación matricial a partir del data frame
# Se asume que cada variable es  >= 0! (ver ?lp)
items.mat <- t(table(df$sets, df$n))
dimnames(items.mat) = list(items = 1:5, sets = paste0("s", 1:4))
items.mat
# Matriz
      sets
 items s1 s2 s3 s4
     1  1  0  0  0
     2  1  1  0  0
     3  1  0  1  0
     4  0  1  1  1
     5  0  0  0  1
f.obj <-  rep(1, 4)  # Valores de las variables de las inecuaciones
f.dir <- rep(">=", 5) # La cadena de texto de las restricciones por fila
f.rhs <- rep(1, 5)    # Los valores de la desigualdad por fila
lp("min", f.obj, items.mat, f.dir, f.rhs)$solution
[1] 1 0 0 1
La solución son los conjuntos s1 y s4 indicados por los coeficientes de las columnas: el 1º y el 4º.

Referencias

2016-09-19

Editar un bloque de texto vertical en Notepad++

Title

Problema

Queremos editar simultáneamente columnas en Notepad++. En el siguiente ejemplo, cambiaremos el campo name por id y le asignaremos la serie del 1 al 3.

Solución

  • Alt + Mayús + Cursor o ratón, o bien
  • Alt + Arrastramos el ratón

Entradas relacionadas

2016-09-07

VBA - Reemplazar la extensión de todos los ficheros de una carpeta

Title

Problema

Queremos reemplazar la extensión de todos los ficheros de una carpeta.

Solución

  1. Abrimos el Editor de Microsoft Visual Basic: Alt+F11.
  2. Copiamos el siguiente código.
  3. Sub CambiarExt()
    
        With CreateObject("wscript.shell")
           .currentdirectory = CurDir
           .Run "%comspec% /c ren *.xls *.xlsx", 0, True
        End With
    
    End Sub
    
  4. Guardamos el fichero Excel en la carpeta de destino, donde se encuentran los ficheros que deseamos cambiar.
  5. Ejecutamos el código: F5.

Notas

CurDir - Indica el directorio de destino en el que se realiza el reemplazamiento. Si deseamos otra ruta la especificamos entre comillas. Ej:"C:\Usarios\Carpeta\Excel pruebas\"
.Run "%comspec% /c ren - Ejecuta cmd.exe y renombra los ficheros.
*xls - En nuestro ejemplo el primer argumento del fichero, es la extensión actual de los ficheros.
*xls - En nuestro ejemplo el segundo argumento del fichero, es la extensión final o deseada de los ficheros.

Podemos indicar todo tipo de extensiones: *txt a *csv por ejemplo. Se trata tan sólo de un ejemplo muy sencillo al que podemos añadir otras funcionalidades: mediante mensajes de texto o desplegables en texto en los que el usuario pueda definir los parámetros anteriores.

Entradas relacionadas

2016-09-05

Convertir el tipo de objeto de todas las columnas de un data frame

Title

Problema

En R podemos usar las siguientes funciones para convertir el tipo de objeto de un vector a otro:

as.character(x)
as.complex(x)
as.numeric(x) or as.double(x)
as.integer(x)
as.logical(x)

Pero si deseamos convertir todas las columnas de un data frame, ¿qué podemos hacer?.

Solución

Tomamos como ejemplo el data frame mtcars al que le asignaremos el nombre df.

df <- mtcars
str(df)

'data.frame': 32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
  • Opción 1
  • df <- data.frame(lapply(df, as.character), stringsAsFactors = FALSE)
    
  • Opción 2
  • Más conicsa.

    df[] <- lapply(df, as.character)
    

Resultado

Ahora todas las columnas son del tipo carácter.

str(df)

'data.frame': 32 obs. of  11 variables:
 $ mpg : chr  "21" "21" "22.8" "21.4" ...
 $ cyl : chr  "6" "6" "4" "6" ...
 $ disp: chr  "160" "160" "108" "258" ...
 $ hp  : chr  "110" "110" "93" "110" ...
 $ drat: chr  "3.9" "3.9" "3.85" "3.08" ...
 $ wt  : chr  "2.62" "2.875" "2.32" "3.215" ...
 $ qsec: chr  "16.46" "17.02" "18.61" "19.44" ...
 $ vs  : chr  "0" "0" "1" "1" ...
 $ am  : chr  "1" "1" "1" "0" ...
 $ gear: chr  "4" "4" "4" "3" ...
 $ carb: chr  "4" "4" "1" "1" ...

Referencias

Nube de datos