Considere el siguiente código R.

> x = cbind(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
> x
     [,1] [,2] [,3]     
[1,] "10" "[]" "[[1,2]]"
[2,] "20" "[]" "[[1,3]]"

Del mismo modo

> x = rbind(c(10, "[]", "[[1,2]]"), c(20, "[]", "[[1,3]]"))
> x
     [,1] [,2] [,3]     
[1,] "10" "[]" "[[1,2]]"
[2,] "20" "[]" "[[1,3]]"

Ahora, no quiero que los enteros 10 y 20 se convierten en cadenas.
¿Cómo puedo realizar esta operación sin esa conversión? Me gustaría de
por supuesto, también quisiera saber por qué esta conversión ocurre. Me miró
el cbind ayuda y también trató de buscar en Google, pero no tuvo suerte de encontrar un
solución. También creo que en algunos casos. R convierte las cadenas de
factores, y no quiero que eso suceda, aunque no lo parezca
para estar sucediendo aquí.

  • El problema no es con cbind, pero con c. Que es la función que usted necesita para comprender mejor.
InformationsquelleAutor Faheem Mitha | 2012-10-08

2 Comentarios

  1. 38

    Vectores y matrices sólo puede ser de un solo tipo y cbind y rbind en vectores dará matrices. En estos casos, los valores numéricos serán promovidos los valores de los caracteres, ya que el tipo va a contener todos los valores.

    (Tenga en cuenta que su rbind ejemplo, la promoción sucede dentro de la c llamada:

    > c(10, "[]", "[[1,2]]")
    [1] "10"      "[]"      "[[1,2]]"

    Si quieres una estructura rectangular en la que las columnas pueden ser de diferentes tipos, desea un data.frame. Cualquiera de los siguientes debe obtener lo que desea:

    > x = data.frame(v1=c(10, 20), v2=c("[]", "[]"), v3=c("[[1,2]]","[[1,3]]"))
    > x
      v1 v2      v3
    1 10 [] [[1,2]]
    2 20 [] [[1,3]]
    > str(x)
    'data.frame':   2 obs. of  3 variables:
     $ v1: num  10 20
     $ v2: Factor w/ 1 level "[]": 1 1
     $ v3: Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2

    o (utilizando específicamente la data.frame versión de cbind)

    > x = cbind.data.frame(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
    > x
      c(10, 20) c("[]", "[]") c("[[1,2]]", "[[1,3]]")
    1        10            []                 [[1,2]]
    2        20            []                 [[1,3]]
    > str(x)
    'data.frame':   2 obs. of  3 variables:
     $ c(10, 20)              : num  10 20
     $ c("[]", "[]")          : Factor w/ 1 level "[]": 1 1
     $ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2

    o (utilizando cbind, pero hacer de la primera una data.frame para que se combina como de datos.marcos):

    > x = cbind(data.frame(c(10, 20)), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
    > x
      c.10..20. c("[]", "[]") c("[[1,2]]", "[[1,3]]")
    1        10            []                 [[1,2]]
    2        20            []                 [[1,3]]
    > str(x)
    'data.frame':   2 obs. of  3 variables:
     $ c.10..20.              : num  10 20
     $ c("[]", "[]")          : Factor w/ 1 level "[]": 1 1
     $ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2
    • Gracias por la respuesta detallada. No creo que me necesite las propiedades de los Factores de aquí, y mi recuerdo es que pueden causar problemas. Hay alguna manera de crear un marco de datos con los valores de cadena en su lugar?
    • Agregar stringsAsFactors=FALSE a la data.frame llamadas. Si las llamadas están implícitos (como en el último ejemplo), entonces usted tiene que hacerlas explícitas: data.frame(c("[]", "[]"), stringsAsFactors=FALSE).
    • Hay una opción global stringsAsFactors así que controla esto. Dejo como el enviado de forma predeterminada y el cambio sobre una base como-necesaria para la reproducibilidad.
    • Puedo obtener $ c("[]", "[]") : chr "[]" "[]" en lugar de $ c("[]", "[]") : Factor w/ 1 level "[]": 1 1. estoy usando R 1.15.1. Alguna idea de por qué la diferencia?
    • ¿Qué se obtiene getOption("stringsAsFactors")?
    • Ah sí, se me olvidaba me puse options(stringsAsFactors=FALSE) en .Rprofile. Tal vez que no era una buena idea.

  2. 14

    Utilizando data.frame en lugar de cbind debe ser útil

    x <- data.frame(col1=c(10, 20), col2=c("[]", "[]"), col3=c("[[1,2]]","[[1,3]]"))
    x
      col1 col2    col3
    1   10   [] [[1,2]]
    2   20   [] [[1,3]]
    
    sapply(x, class) # looking into x to see the class of each element
         col1      col2      col3 
    "numeric"  "factor"  "factor" 

    Como se puede ver los elementos de col1 se numeric como usted desea.

    data.frame puede tener variables de diferentes class: numeric, factor y character pero matrix no, una vez que pones un character elemento en una matriz de todos los demás se convertirán en esta clase no importa de qué clase eran antes.

    • Gracias. Puedo hacer que la clase de col2 y col3 en cadena?

Dejar respuesta

Please enter your comment!
Please enter your name here