在 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.