2010-12-01 22 views
7

Importé datos de un archivo .csv y adjunté el conjunto de datos.
Mi problema: una variable está en forma de número entero y tiene 295 niveles. Necesito usar esta variable para crear otras, pero no sé cómo lidiar con los niveles.Niveles en el R Dataframe

¿Qué son estos y cómo los trato?

+0

Esto podría significar algunas cosas, dependiendo de lo que quiere decir con 'niveles'. Suena un poco como si sus números se hubieran convertido a variables de factor porque en alguna parte es un número mal formado, entonces R lo convierte todo en variables categóricas de "factor". ¿Podría cortar y pegar el código exacto y los mensajes de error aquí, por favor? – Spacedman

+0

¿Has leído '? Factor'? O '? Levels' – Marek

+0

setwd (" D:/users/me/Desktop ") data <- read.csv (" Rdata.csv ") attach (data) ctr <- for (i en 1: 4722) \t \t {as.integer (a [i]/b [i])} – user446667

Respuesta

1

Haga un resumen (datos) para verificar que las cosas se leyeron correctamente. Si las columnas no son numéricas, debería mirar el argumento colClasses a read.csv para forzarlo, lo que probablemente también dé como resultado valores de NA para los números mal formados.

ayuda (read.csv) ayudará.

+0

Espaciador: puede usar colClasses para forzar a las NA? Lo pensé al principio, pero txt <- c ("x, y, z", "1,2,3", "a, b, c", "1,2,3"); d <- read.table (textConnection (txt), sep = ",", header = TRUE, colClasses = rep ("numérico", 3)) errores en el escaneo. ¿Hay algo que me falta en read.table? – mdsumner

+0

@mdsummer: saque esas comillas dobles. Están agrupando a tus personajes de una manera que no estás intentando. –

+0

@mdsummer: Pero el problema persistió, de todos modos. as.is = TRUE es necesario. –

8

Cuando lee los datos con read.table (o read.csv? - usted no especificó), agregue el argumento stringsAsFactors = FALSE. Entonces obtendrás datos de personaje en su lugar.

Si está esperando enteros para la columna, debe tener datos que no se pueden interpretar como enteros, por lo que conviértelos en numéricos después de leerlos.

txt <- c("x,y,z", "1,2,3", "a,b,c") 

d <- read.csv(textConnection(txt)) 
sapply(d, class) 
     x  y  z 
##"factor" "factor" "factor" 

## we don't want factors, but characters 
d <- read.csv(textConnection(txt), stringsAsFactors = FALSE) 
sapply(d, class) 

#   x   y   z 
#"character" "character" "character" 

## convert x to numeric, and wear NAs for non numeric data 
as.numeric(d$x) 

#[1] 1 NA 
#Warning message: 
#NAs introduced by coercion 

Por último, si desea ignorar estos detalles de entrada y extraer los niveles enteros del factor use p. Ej. as.numeric (levels (d $ x)) [d $ x], según "Warning" en? factor. !

+0

¡Gracias por el tutorial! –

4

Trabajando desde su aclaración le sugiero que rehacer su estado de lectura con read.table y la cabecera = VERDADERO, FALSO = stringAsFactors y as.is = stringsAsFactors y sep = "":

datinp <- read.table("Rdata.csv", header=TRUE, stringAsFactors=FALSE , 
         as.is = !stringsAsFactors , sep=",") 
datinp$a <- as.numeric(datinp$a) 
datinp$b <- as.numeric(datinp$b) 
datinp$ctr <- with(datinp, as.integer(a/b)) # no loop needed when using vector arithmetic 
5

o usted puede simplemente usar

d$x2 = as.numeric(as.character(d$x)).

Cuestiones relacionadas