R语言 把DataFrame列转换为数值

R语言 把DataFrame列转换为数值

在这篇文章中,我们将看到如何在R编程语言中把DataFrame列转换为数字。

所有的数据框架列都与一个类相关联,这个类是该列元素所属的数据类型的指标。因此,为了模拟数据类型的转换,在这种情况下,数据元素必须被转换为所需的数据类型,即该列的所有元素应该有资格成为数值。

sapply()方法可以用来检索向量形式的列变量的数据类型。用于以下操作的数据框架如下: 。

# 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)
R

输出

[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"
R

transform()方法可以用来模拟在该方法的参数列表中指定的数据对象的修改。这些修改必须明确地保存到同一个数据框架或一个新的数据框架中。它可以用来向数据添加新的变量或修改现有的变量。

语法: transform(data, value)

参数:

  • data – 要修改的数据对象
  • value – 要添加的值

例子1:将因子类型的列转换为数值型的

在进行这些转换时,数据可能不会被保存下来。可能会出现数据丢失或篡改的情况。转换操作的结果必须被保存在某个变量中,以便进一步处理它。下面的代码片段说明了这一点。

# 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)
R

输出

[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" 
R

解释: col2中的原始数据框架值范围是4到7,而在modified中是以1开始的整数。这意味着在直接将因子转换为数字时,数据可能不会被保留。

为了保留数据,需要首先明确地将列的类型转换为as.character(col-name)。

# 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)
R

输出

[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" 
R

说明: 为了保持数据的统一性,首先将col2的数据类型改为as.character,然后再改为数值,这样就可以显示出数据的原貌。

例2:将字符型列转换为数值型

字符类型的列,无论是单个字符还是字符串,只有在这些转换是可能的情况下,才能转换为数字值。否则,数据就会丢失,并在执行时被编译器胁迫为缺失或NA值。

这种方法描述了由于插入缺失或NA值来代替字符而造成的数据损失。这些NA值的引入是因为相互转换是不可能直接实现的。

# 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)
R

输出

[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
R

解释: 使用sapply()方法,数据框架col3的类别是字符,即由单字节的字符值组成,但是在应用transform()方法时,这些字符值被转换成缺失或NA值,因为字符不能直接转换为数字数据。所以,这导致了数据丢失。

可以通过不使用stringAsFactors=FALSE来进行转换,然后首先使用as.factor()隐含地将字符转换为因子,然后使用as.numeric()转换为数字数据类型。即使在这种情况下,关于实际字符串的信息也会完全丢失。然而,数据变得模糊不清,并可能导致实际数据丢失。数据只是根据列值的lexicographic排序结果被赋予数字值。

# 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)
R

输出

[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" 
R

解释: col3中的第一个和第三个字符串是相同的,因此,分配了相同的数字值。总的来说,这些数值是按升序排序的,然后分配给相应的整数值。”For “是以词法顺序出现的最小的字符串,因此,分配数值为1,然后是 “Geeks”,这两个实例都被映射为2,”Gooks “被分配数值为3。 因此,col3的类型变为数值。

例3:将逻辑类型列转换为数字 类型

真值布尔值被赋予相当于2的数值,假值被赋予1的数值。

为了保留数据,由这些逻辑值组成的列首先用as.factor转换为因子类型的值,然后用as.numeric()给这些值分配一个数值,它只是给这两个值分配了整数标识。

# 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)
R

输出

[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" 
R

解释: 使用sapply()方法,数据框架中col5的类别是逻辑的,也就是由TRUE和FALSE布尔值组成,但是在应用transform()方法时,这些逻辑值被映射为整数,col5的类别被转换为数字的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册