2011-06-13 16 views
17

Tengo un archivo de datos con el formato anterior.
Lo cargué en R e intenté trazar un histograma con los valores de la columna de dist y recibí el error "x debe ser numérico". Por lo tanto, traté de cambiar el formato.Cambiar valores al convertir el tipo de columna a numérico

> head(data) 

    V1  V2 
1 type gene_dist 
2 A  64667 
3 A  76486 
4 A  97416 
5 A  30876 
6 A  88018 

> summary(data) 
    V1   V2  
A : 67 100 : 1 
B :122 100906 : 1 
type: 1 102349 : 1 
      1033 : 1 
      10544 : 1 
      10745 : 1 
      (Other):184 

Me trataron de establecer el formato de la columna usando sapply pero los valores se cambian:

> data[,2]<-sapply(data[,2],as.numeric) 

> head(data) 
    V1 V2 
1 type 190 
2 A 146 
3 A 166 
4 A 189 

summary(data) 
    V1   V2   
A : 67 Min. : 1.00 
B :122 1st Qu.: 48.25 
type: 1 Median : 95.50 
      Mean : 95.50 
      3rd Qu.:142.75 
      Max. :190.00 

¿Alguien sabe por qué sucede esto?

+0

puede pegar la salida de 'dput (data)' para que podamos reproducir sus resultados. Mi sospecha es que está convirtiendo un 'factor' en' numérico' directamente, lo que está causando el problema. Intente reemplazarlo con 'function (x) as.character (as.numeric (x)) 'y ver si eso funciona – Ramnath

+0

@ Ramnath - problema resuelto con as.numeric (as.character (x)) – agatha

+0

Parece que R está clasificando las columnas como factores porque está leyendo el encabezado como una fila entrada. Configurando 'header = T' en su llamada' read.table() 'debería arreglar esto. –

Respuesta

32

Parece que su segunda columna es un factor. Debe usar as.character antes del as.numeric. Esto se debe a que los factores se almacenan internamente como enteros con una tabla para dar las etiquetas de nivel de factor. Solo usando as.numeric solo se darán los códigos enteros internos. No es necesario utilizar sapply ya que estas funciones están vectorizadas.

data[,2] <- as.numeric(as.character(data[,2])) 

Es probable que la columna sea un factor porque hay algunos caracteres no numéricos en algunas de las entradas. Cualquiera de esas entradas se convertirá en NA con la advertencia correspondiente, pero es posible que desee investigar esto en sus datos brutos.

Como nota al margen, data es una opción pobre (aunque no inválida) para un nombre de variable ya que hay una función base del mismo nombre.

+0

@ James: Funcionó. Gracias y consideraré su observación. – agatha

+0

@Andra Puedo ver ahora que su pregunta está formateada un poco mejor por una razón que es un factor es que los nombres de columna están incluidos en los datos. Es posible que desee agregar un argumento 'header = TRUE' al comando con el que lee los datos. – James

+0

@ James- Lo recordaré. - Eliminé las columnas del archivo de texto y las agregué manualmente, probablemente no de la manera más elegante ... pero funciona. colnames (chip_data) <- c ("type", "gene_dist") – agatha

0

Tuve el mismo problema para una matriz que contiene valores 'list', cuando se leyó un objeto data desde read.csv. as.character() no funciona aquí, y as.numeric() y data.matrix() cambiaron los valores en la matriz. En su lugar es necesario utilizar el siguiente:

matrix_numeric[1:m,1:n] <- as.numeric(as.matrix(data[1:m,1:n]))

En primer lugar convertir a un personaje luego a un doble. Para datos de dimensiones matriciales [m, n]. (Se necesita para crear el objeto matrix_numeric primero antes de la asignación de valores ... matrix_numeric <- matrix(0,m,n))

Para un vector vec1 en formato de lista, utilizo el siguiente:

out1 <- as.numeric(unlist(vec1));

0

es probable que sea mucho mejor para solucionarlo al leer el archivo que utilizando as.numeric() o as.character(). Al leer el archivo, asegúrese de tener

  • header=TRUE si la primera fila es encabezado
  • NA y no Na o NaN (Ctrl + H y reemplazar por NA en su archivo de datos)
  • no hay otras cadenas de caracteres en sus columnas numéricas

Entonces R las considerará automáticamente como numéricas.

Cuestiones relacionadas