在 R 中将多列从整数转换为数字类型

Jesse John 2023年1月30日
  1. 在 R 中将多列从整数转换为数字类型
  2. 使用 lapply() 函数将多列从整数转换为 R 中的数字类型
  3. 使用 dplyr 包函数将多列从整数转换为 R 中的数字类型
  4. 在 R 中将多列从因子转换为数值类型
  5. 结论
在 R 中将多列从整数转换为数字类型

R 具有矢量化函数,可通过一行代码将多列从整数类型转换为数值类型,而无需使用循环。本文探讨了完成此任务的两种方法。

在这两种情况下,每一列的实际转换都是由 as.numeric() 函数完成的。

在 R 中将多列从整数转换为数字类型

首先,我们将创建一些示例数据。

示例代码:

# Create vectors.
n = letters[1:5]
p = as.integer(c(11:15))
q = as.integer(c(51:55))

# Create a data frame.
df = data.frame(Names = n, Col1 = p, Col2 = q)
df

# See the structure of the data frame.
# Note that two columns are of integer type.
str(df)

输出:

> df
  Names Col1 Col2
1     a   11   51
2     b   12   52
3     c   13   53
4     d   14   54
5     e   15   55
>
> # See the structure of the data frame.
> # Note that two columns are of integer type.
> str(df)
'data.frame':    5 obs. of  3 variables:
 $ Names: chr  "a" "b" "c" "d" ...
 $ Col1 : int  11 12 13 14 15
 $ Col2 : int  51 52 53 54 55

使用 lapply() 函数将多列从整数转换为 R 中的数字类型

Base R 的 lapply() 函数允许我们将函数应用于列表的元素。我们将应用 as.numeric() 函数。

lapply() 函数的文档建议对我们在其中指定的函数名称使用包装函数。

示例代码:

# First, we will create a copy of our data frame.
df1 = df

# Columns 2 and 3 are integer type.
# We will convert these to numeric.
# We will use a wrapper function as recommended.
df1[2:3] = lapply(df1[2:3], FUN = function(y){as.numeric(y)})

# Check that the columns are converted to numeric.
str(df1)

输出:

> df1[2:3] = lapply(df1[2:3], FUN = function(y){as.numeric(y)})
>
> # Check that the columns are converted to numeric.
> str(df1)
'data.frame':    5 obs. of  3 variables:
 $ Names: chr  "a" "b" "c" "d" ...
 $ Col1 : num  11 12 13 14 15
 $ Col2 : num  51 52 53 54 55

使用 dplyr 包函数将多列从整数转换为 R 中的数字类型

我们可以使用 dplyrmutate()across() 函数将整数列转换为数字。这样做的好处是整个系列的 tidyselect 函数都可用于选择列。

我们将在示例代码中使用标准列表语法和 tidyselect 函数 where() 选择列。

示例代码:

# Load the dplyr package.
library(dplyr)

# USING STANDARD LIST SYNTAX.
# Convert the columns.
df2 = df %>% mutate(across(.cols=2:3, .fns=as.numeric))

# Check that the columns are converted.
str(df2)

# USING TIDYSELECT WHERE FUNCTION.
# Convert ALL integer columns to numeric.
df3 = df %>% mutate(across(.cols=where(is.integer), .fns=as.numeric))

# Check that the columns are converted.
str(df3)

输出:

# USING STANDARD LIST SYNTAX.
# Convert the columns.
df2 = df %>% mutate(across(.cols=2:3, .fns=as.numeric))

# Check that the columns are converted.
str(df2)

# USING TIDYSELECT WHERE FUNCTION.
# Convert ALL integer columns to numeric.
df3 = df %>% mutate(across(.cols=where(is.integer), .fns=as.numeric))

# Check that the columns are converted.
str(df3)

在 R 中将多列从因子转换为数值类型

有时,因子水平用数字编码,主要是整数。我们不想转换这些列。

但是,在其他时候,具有整数的列可能会表示为 R 中的因子。将这些列转换为数字会带来挑战。

示例代码显示了将因子列转换为数值时会发生什么。

示例代码:

# Create a factor vector.
x = factor(c(15,15,20,25,30,30,30))

# See that these are 4 levels of factors.
# They are not numbers.
str(x)

# Convert the factor vector to numeric.
as.numeric(x) # This is not the result we want.

输出:

> # Create a factor vector.
> x = factor(c(15,15,20,25,30,30,30))
>
> # See that these are 4 levels of factors.
> # They are not numbers.
> str(x)
 Factor w/ 4 levels "15","20","25",..: 1 1 2 3 4 4 4
>
> # Convert the factor vector to numeric.
> as.numeric(x) # This is not the result we want.
[1] 1 1 2 3 4 4 4

当整数列碰巧被错误地表示为因子时,我们需要添加一个预备步骤以将其正确转换为数字。

我们必须先将因子转换为字符类型,然后再将字符转换为数值类型。

示例代码:

# First, convert the factor vector to a character type.
# Then convert the character type to numeric.
# Both the above can be done in a single step, as follows.
y = as.numeric(as.character(x))
y

# Check that y is numeric.
str(y)

输出:

> y = as.numeric(as.character(x))
> y
[1] 15 15 20 25 30 30 30
>
> # Check that y is numeric.
> str(y)
 num [1:7] 15 15 20 25 30 30 30

让我们看一个带有数据框的示例。我们将使用 dplyr 方法。

示例代码:

# Create a factor vector.
f = factor(c(20,20,30,30,30))

# Create a data frame.
df4 = data.frame(Name=n, Col1=p, Col2=q, Fac=f)
df4

# Check the structure.
str(df4)

# We will use the dplyr approach.

# First only convert integer type columns.
df5 = df4 %>% mutate(across(.cols=where(is.integer), .fns=as.numeric))
# Factor column did not get converted.
str(df5)

# Now, we will START AGAIN, and convert the factor column as well.
# To modify an existing column by name, we will give it the SAME name.
df6 = df4 %>% mutate(across(.cols=where(is.integer), .fns=as.numeric), Fac=as.numeric(as.character(Fac)))
df6
# Check that the factor column has also got converted.
str(df6)

输出:

> # Create a factor vector.
> f = factor(c(20,20,30,30,30))
>
> # Create a data frame.
> df4 = data.frame(Name=n, Col1=p, Col2=q, Fac=f)
> df4
  Name Col1 Col2 Fac
1    a   11   51  20
2    b   12   52  20
3    c   13   53  30
4    d   14   54  30
5    e   15   55  30
>
> # Check the structure.
> str(df4)
'data.frame':    5 obs. of  4 variables:
 $ Name: chr  "a" "b" "c" "d" ...
 $ Col1: int  11 12 13 14 15
 $ Col2: int  51 52 53 54 55
 $ Fac : Factor w/ 2 levels "20","30": 1 1 2 2 2
>
> # We will use the dplyr approach.
>
> # First only convert integer type columns.
> df5 = df4 %>% mutate(across(.cols=where(is.integer), .fns=as.numeric))
> # Factor column did not get converted.
> str(df5)
'data.frame':    5 obs. of  4 variables:
 $ Name: chr  "a" "b" "c" "d" ...
 $ Col1: num  11 12 13 14 15
 $ Col2: num  51 52 53 54 55
 $ Fac : Factor w/ 2 levels "20","30": 1 1 2 2 2
>
> # Now, we will START AGAIN, and convert the factor column as well.
> # To modify an existing column by name, we will give it the SAME name.
> df6 = df4 %>% mutate(across(.cols=where(is.integer), .fns=as.numeric), Fac=as.numeric(as.character(Fac)))
> df6
  Name Col1 Col2 Fac
1    a   11   51  20
2    b   12   52  20
3    c   13   53  30
4    d   14   54  30
5    e   15   55  30
> # Check that the factor column has also got converted.
> str(df6)
'data.frame':    5 obs. of  4 variables:
 $ Name: chr  "a" "b" "c" "d" ...
 $ Col1: num  11 12 13 14 15
 $ Col2: num  51 52 53 54 55
 $ Fac : num  20 20 30 30 30

tidyselect 函数的文档在选择语言网页上。请参阅 R 的 lapply() 函数文档以了解对包装函数的需求。

as.numeric() 函数的文档提供了第二种将表示为因子的整数转换为数值类型的方法。

结论

在开始将整数列转换为数值类型之前,我们需要检查整数列是否为整数类型。如果将它们表示为因子并希望将它们转换为数字,我们需要采取额外的步骤来确保正确转换。

可以使用基本 R 的 lapply() 函数或 dplyrmutate()across() 函数的组合来完成转换。实际的转换是使用 as.numeric() 函数完成的。

作者: Jesse John
Jesse John avatar Jesse John avatar

Jesse is passionate about data analysis and visualization. He uses the R statistical programming language for all aspects of his work.