Convertir columna de marco de datos a numérico en R

En este artículo, veremos cómo convertir la columna DataFrame a Numeric en el lenguaje de programación R. 

Toda columna de marco de datos está asociada con una clase que es un indicador del tipo de datos al que pertenecen los elementos de esa columna. Por lo tanto, para simular la conversión del tipo de datos, los elementos de datos deben convertirse al tipo de datos deseado en este caso, es decir, todos los elementos de esa columna deben ser elegibles para convertirse en valores numéricos. 

El método sapply() se puede utilizar para recuperar el tipo de datos de las variables de columna en forma de vector. El marco de datos que se utiliza para las siguientes operaciones es el siguiente: 

R

# declare a dataframe
# different data type have been 
# indicated for different cols
data_frame <- data.frame(
                col1 = as.character(1:4), 
                col2 = factor(4:7), 
                col3 = letters[2:5], 
                col4 = 97:100, stringsAsFactors = FALSE)
  
print("Original DataFrame")
print (data_frame)
  
# indicating the data type of 
# each variable 
sapply(data_frame, class)

Producción:

[1] "Original DataFrame"
 col1 col2 col3 col4
1    1    4    b   97
2    2    5    c   98
3    3    6    d   99
4    4    7    e  100
      col1        col2        col3        col4
"character"    "factor" "character"   "integer"

El método transform() se puede usar para simular la modificación en el objeto de datos especificado en la lista de argumentos de este método. Los cambios deben guardarse explícitamente en el mismo marco de datos o en uno nuevo. Se puede usar para agregar nuevas variables a los datos o modificar las existentes. 

Sintaxis: transformar (datos, valor)

Argumentos: 

  • datos: el objeto de datos que se va a modificar
  • valor: el valor que se agregará

Ejemplo 1: conversión de columnas de tipo de factor a numéricas 

Es posible que los datos no se conserven mientras se realizan estas conversiones. Puede haber pérdida o manipulación de los datos. El resultado de la operación de transformación debe guardarse en alguna variable para seguir trabajando con él. El siguiente fragmento de código ilustra esto: 

R

# declare a dataframe
# different data type have been
# indicated for different cols
data_frame <- data.frame(
                col1 = as.character(1:4), 
                col2 = factor(4:7), 
                col3 = letters[2:5], 
                col4 = 97:100, stringsAsFactors = FALSE)
  
print("Original DataFrame")
print (data_frame)
  
# indicating the data type of each 
# variable 
sapply(data_frame, class)
  
# converting factor type column to 
# numeric 
data_frame_mod <- transform(
  data_frame,col2 = as.numeric(col2))
  
print("Modified DataFrame")
print (data_frame_mod)
  
# indicating the data type of each variable 
sapply(data_frame_mod, class)

Producción:

[1] "Original DataFrame"
 col1 col2 col3 col4
1    1    4    b   97
2    2    5    c   98
3    3    6    d   99
4    4    7    e  100
      col1        col2        col3        col4
"character"    "factor" "character"   "integer"
[1] "Modified DataFrame"
 col1 col2 col3 col4
1    1    1    b   97
2    2    2    c   98
3    3    3    d   99
4    4    4    e  100
      col1        col2        col3        col4
"character"   "numeric" "character"   "integer" 

Explicación: Los valores del marco de datos original en col2 varían de 4 a 7, mientras que en modificado son números enteros que comienzan con 1. Esto significa que durante la conversión directa de factor a numérico, es posible que los datos no se conserven. 

Para conservar los datos, el tipo de las columnas debe convertirse explícitamente primero en as.character(col-name). 

R

# declare a dataframe
# different data type have been 
# indicated for different cols
data_frame <- data.frame(
                col1 = as.character(1:4), 
                col2 = factor(4:7), 
                col3 = letters[2:5], 
                col4 = 97:100, stringsAsFactors = FALSE)
  
print("Original DataFrame")
print (data_frame)
  
# indicating the data type of each
# variable 
sapply(data_frame, class)
  
# converting factor type column to 
# numeric 
data_frame_mod <- transform(
  data_frame, col2 = as.numeric(as.character(col2)))
  
print("Modified DataFrame")
print (data_frame_mod)
  
# indicating the data type of each
# variable 
sapply(data_frame_mod, class)

Producción:

[1] "Original DataFrame"
 col1 col2 col3 col4
1    1    4    b   97
2    2    5    c   98
3    3    6    d   99
4    4    7    e  100
      col1        col2        col3        col4
"character"    "factor" "character"   "integer"
[1] "Modified DataFrame"
 col1 col2 col3 col4
1    1    4    b   97
2    2    5    c   98
3    3    6    d   99
4    4    7    e  100
      col1        col2        col3        col4
"character"   "numeric" "character"   "integer" 

Explicación: para mantener la uniformidad de los datos, el tipo de datos de col2 primero se cambia a as.character y luego a valores numéricos, lo que muestra los datos tal como son.

Ejemplo 2: Conversión de columnas de tipo de carácter a numéricas 

Las columnas de tipo de carácter, ya sean caracteres individuales o strings, se pueden convertir en valores numéricos solo si estas conversiones son posibles. De lo contrario, los datos se pierden y el compilador los convierte en valores faltantes o NA al momento de la ejecución. 

Este enfoque representa la pérdida de datos debido a la inserción de valores faltantes o NA en lugar de caracteres. Estos valores NA se introducen ya que la interconversión no es posible directamente. 

R

# declare a dataframe
# different data type have been 
# indicated for different cols
data_frame <- data.frame(
                col1 = as.character(6:9), 
                col2 = factor(4:7), 
                col3 = letters[2:5], 
                col4 = 97:100, stringsAsFactors = FALSE)
  
print("Original DataFrame")
print (data_frame)
  
# indicating the data type of each 
# variable 
sapply(data_frame, class)
  
# converting character type column
# to numeric 
data_frame_col1 <- transform(
  data_frame,col1 = as.numeric(col1))
  
print("Modified col1 DataFrame")
print (data_frame_col1)
  
# indicating the data type of each 
# variable 
sapply(data_frame_col1, class)
  
  
# converting character type column 
# to numeric 
data_frame_col3 <- transform(
  data_frame,col3 = as.numeric(col3))
  
print("Modified col3 DataFrame")
print (data_frame_col3)
  
# indicating the data type of each
# variable 
sapply(data_frame_col3, class)

Producción:

[1] "Original DataFrame"
 col1 col2 col3 col4
1    6    4    b   97
2    7    5    c   98
3    8    6    d   99
4    9    7    e  100
      col1        col2        col3        col4
"character"    "factor" "character"   "integer"
[1] "Modified col1 DataFrame"
 col1 col2 col3 col4
1    6    4    b   97
2    7    5    c   98
3    8    6    d   99
4    9    7    e  100
      col1        col2        col3        col4
 "numeric"    "factor" "character"   "integer"
[1] "Modified col3 DataFrame"
 col1 col2 col3 col4
1    6    4   NA   97
2    7    5   NA   98
3    8    6   NA   99
4    9    7   NA  100
      col1        col2        col3        col4
"character"    "factor"   "numeric"   "integer"
Warning message:
In eval(substitute(list(...)), `_data`, parent.frame()) :
 NAs introduced by coercion

Explicación: al usar el método sapply(), la clase de col3 del marco de datos es un carácter, es decir, consta de valores de carácter de un solo byte, pero al aplicar el método transform(), estos valores de carácter se convierten en valores faltantes o NA, porque el carácter no se puede convertir directamente en datos numéricos. Entonces, esto conduce a la pérdida de datos. 

La conversión se puede realizar sin usar stringAsFactors=FALSE y luego convertir implícitamente el carácter a factor usando as.factor() y luego a tipo de datos numérico usando as.numeric(). La información sobre las strings reales se pierde por completo incluso en este caso. Sin embargo, los datos se vuelven ambiguos y pueden conducir a la pérdida real de datos. A los datos simplemente se les asignan valores numéricos basados ​​en el resultado de la clasificación lexicográfica de los valores de la columna. 

R

# declare a dataframe
# different data type have been 
# indicated for different cols
data_frame <- data.frame(
                col1 = as.character(6:9), 
                col2 = factor(4:7), 
                col3 = c("Geeks","For","Geeks","Gooks"), 
                col4 = 97:100)
  
print("Original DataFrame")
print (data_frame)
  
# indicating the data type of each
# variable 
sapply(data_frame, class)
  
# converting character type column 
# to numeric 
data_frame_col3 <- transform(
  data_frame,col3 = as.numeric(as.factor(col3)))
  
print("Modified col3 DataFrame")
print (data_frame_col3)
  
# indicating the data type of each
# variable 
sapply(data_frame_col3, class)

Producción:

[1] "Original DataFrame"
 col1 col2  col3 col4
1    6    4 Geeks   97
2    7    5   For   98
3    8    6 Geeks   99
4    9    7 Gooks  100
    col1      col2      col3      col4
"factor"  "factor"  "factor" "integer"
[1] "Modified col3 DataFrame"
 col1 col2 col3 col4
1    6    4    2   97
2    7    5    1   98
3    8    6    2   99
4    9    7    3  100
    col1      col2      col3      col4
"factor"  "factor" "numeric" "integer" 

Explicación: la primera y la tercera string en col3 son iguales, por lo tanto, se les asigna el mismo valor numérico. Y en total, los valores se ordenan en orden ascendente y luego se les asignan los valores enteros correspondientes. «For» es la string más pequeña que aparece en orden lexicográfico, por lo tanto, se le asigna un valor numérico de 1, luego «Geeks», ambas instancias se asignan a 2 y «Gooks» se le asigna un valor numérico de 3. Por lo tanto, el tipo col3 cambia a numérico.

Ejemplo 3: Conversión de columnas de tipo lógico a numérico 

Al valor booleano de verdad se le asigna un valor numérico equivalente a 2 ya falso se le asigna un valor numérico de 1. La conversión se puede realizar fácilmente manteniendo la uniformidad de los datos.

Para preservar los datos, la columna que consta de estos valores lógicos se transforma primero en valores de tipo de factor usando as.factor y luego a estos valores se les asigna un valor numérico usando as.numeric(), que simplemente asigna identificadores enteros a estos dos valores. . 

R

# declare a dataframe
# different data type have been
# indicated for different cols
data_frame <- data.frame(
                col1 = as.character(6:9), 
                col2 = factor(4:7), 
                col3 = c("Geeks","For","Geeks","Gooks"), 
                col4 = 97:100,
                col5 = c(TRUE,FALSE,TRUE,FALSE))
  
print("Original DataFrame")
print (data_frame)
  
# indicating the data type of each 
# variable 
sapply(data_frame, class)
  
# converting character type column 
# to numeric 
data_frame_col5 <- transform(
  data_frame,col5 = as.numeric(as.factor(col5)))
print("Modified col5 DataFrame")
print (data_frame_col5)
  
# indicating the data type of each 
# variable 
sapply(data_frame_col5, class)

Producción:

[1] "Original DataFrame"
 col1 col2  col3 col4  col5
1    6    4 Geeks   97  TRUE
2    7    5   For   98 FALSE
3    8    6 Geeks   99  TRUE
4    9    7 Gooks  100 FALSE
    col1      col2      col3      col4      col5
"factor"  "factor"  "factor" "integer" "logical"
[1] "Modified col5 DataFrame"
 col1 col2  col3 col4 col5
1    6    4 Geeks   97    2
2    7    5   For   98    1
3    8    6 Geeks   99    2
4    9    7 Gooks  100    1
    col1      col2      col3      col4      col5
"factor"  "factor"  "factor" "integer" "numeric" 

Explicación: al usar el método sapply(), la clase de col5 del marco de datos es lógica, es decir, consta de valores booleanos VERDADERO y FALSO, pero en la aplicación del método transform(), estos valores lógicos se asignan a números enteros y la clase de col5 se convierte en numérica. 

Publicación traducida automáticamente

Artículo escrito por mallikagupta90 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *