使用 Dplyr 從資料框中刪除多列

Jesse John 2023年1月30日
  1. 如何設定 R 會話
  2. 在 R 中使用 dplyr 直接按名稱刪除多個列
  3. 在 R 中使用 dplyr 使用字元向量刪除多列
  4. 使用 dplyr 刪除 R 中的連續列
  5. 在 R 中使用 dplyr 使用模式匹配函式刪除列
  6. 在 R 中使用 dplyr 刪除數字範圍內的列名
  7. 在 R 中使用 dplyr 使用函式刪除多列
  8. まとめ
使用 Dplyr 從資料框中刪除多列

在處理表格資料時,我們經常需要選擇列進行顯示。我們可以選擇要顯示的列,也可以刪除不想顯示的列。

本文將學習使用 dplyr 包的 select() 函式從資料框中刪除多個列的各種方法。

如何設定 R 會話

dplyr 是一個用於執行常見資料操作任務的 R 包。dplyrselect() 函式旨在從資料框中選擇列。

!運算子用於取一組變數的補碼。它將幫助我們使用 select() 函式刪除列。

我們將在以下程式碼中載入 dplyr 包,建立一個資料框,然後從該資料框中選擇兩個特定的列。dplyr 包可以直接載入或通過載入 tidyverse 包。

我們將建立一個包含 8 列和 3 行的資料框。

我們將使用管道運算子 %>%> % 使我們的程式碼可讀。這個操作符幫助我們避免巢狀函式和建立/儲存中間結果作為物件。

select() 函式採用資料框的名稱後跟列的名稱(或位置)進行選擇。在本文的示例程式碼中,我們將使用管道運算子提供資料框的名稱。

示例程式碼:

# Load the dplyr package directly.
# Alternately, load the entire tidyverse by running the following one line of code.
# library(tidyverse) # Un-comment to run.
library(dplyr)

# We will create a small data frame for this article.
Col1 = c(10, 11, 12)
Col2 = c(20, 21, 22)
Col7 = c(70, 71, 72)
Col8 = c(80, 81, 82)
dplyrA = c('dA1', 'dA2', 'dA3')
dplyrAA = c('AA1', 'AA2', 'AA3')
Bdplyr = c('dB1', 'dB2', 'dB3')
BBdplyr = c('BB1', 'BB2', 'BB3')

dplyr_df = data.frame(Col1, Col2, Col7, Col8, dplyrA, dplyrAA, Bdplyr, BBdplyr)


# Check the type of object that we created.
class(dplyr_df)

# Display the data frame.
dplyr_df

# Select two columns using their names.
dplyr_df %>% select(Col2, BBdplyr)

最後一條命令的輸出:

> dplyr_df %>% select(Col2, BBdplyr)
  Col2 BBdplyr
1   20     BB1
2   21     BB2
3   22     BB3

當列名直接列在 select() 函式中時,它們被指定為變數。與字串不同,它們不是用引號引起來的。

在 R 中使用 dplyr 直接按名稱刪除多個列

直接按名稱刪除多個列有三種等效方法。

在第一種方法中,我們將使用 c() 函式將列名組合成一個變數向量。要刪除此向量中的所有列,我們將使用!運算子。它給出了這些變數的補碼。

在第二種方法中,我們取要刪除的每一列的補碼的交集。 & 運算子給了我們一個交集。

在第三種方法中,我們補充了列名的並集。 |運算子給了我們一個聯合。

示例程式碼:

# Select the complement of a vector of column names.
dplyr_df %>% select(!c(Col1, dplyrA, BBdplyr))

# Select the intersection of the complement of each column.
dplyr_df %>% select(!Col1 & !dplyrA & !BBdplyr)

# Select the complement of the union of column names.
dplyr_df %>% select(!(Col1 | dplyrA | BBdplyr))

輸出(對於所有三種方法都相同):

  Col2 Col7 Col8 dplyrAA Bdplyr
1   20   70   80     AA1    dB1
2   21   71   81     AA2    dB2
3   22   72   82     AA3    dB3

select() 函式也採用列位置。相當於直接使用列名。

示例程式碼:

# Select the complement of a vector of column positions.
dplyr_df %>% select(!c(1, 5, 8))

# Select the intersection of the complement of each column.
dplyr_df %>% select(!1 & !5 & !8)

# Select the complement of the union of column positions.
dplyr_df %>% select(!(1 | 5 | 8))

在 R 中使用 dplyr 使用字元向量刪除多列

我們可以將列名儲存在一個物件中並在函式中使用該物件,而不是直接在 select() 函式中指定列名。

但是,使用此方法時有兩個關鍵區別。

  1. 列名需要儲存為字元向量,而不是變數名的向量。換句話說,名稱必須是用引號括起來的字串。
  2. 我們將需要使用選擇輔助函式,all_of()any_of()。我們將在示例程式碼中使用 all_of()

示例程式碼:

# Create a character vector using the names of the columns to remove.
# Note the quotes around the column names.
to_remove = c('Col2', 'Col7', 'dplyrAA', 'Bdplyr')

# Select the complement of the column names in the vector 'to_remove'.
dplyr_df %>% select(!all_of(to_remove))

輸出:

> dplyr_df %>% select(!all_of(to_remove))
  Col1 Col8 dplyrA BBdplyr
1   10   80    dA1     BB1
2   11   81    dA2     BB2
3   12   82    dA3     BB3

使用 dplyr 刪除 R 中的連續列

要刪除連續的列,我們將使用 : 運算子。我們可以使用列名或列位置。兩者都給出相同的輸出。

我們將從資料框中刪除列 27;從 Col2Bdplyr 的列。我們將留下第一列和最後一列,Col1BBdplyr

示例程式碼:

# Drop a range of columns specified by column numbers.
dplyr_df %>% select(!(2:7))

# Drop a range of columns specified by column names.
# Note that the variable names are not in quotes.
dplyr_df %>% select(!(Col2:Bdplyr))

兩個命令的輸出相同:

  Col1 BBdplyr
1   10     BB1
2   11     BB2
3   12     BB3

在 R 中使用 dplyr 使用模式匹配函式刪除列

我們可以使用模式匹配函式來刪除多列。這些函式將字串或字串向量作為引數。

它們返回與模式匹配的所有列。要刪除這些列,我們使用!運算子。

需要注意的是,預設情況下,這些函式不區分大小寫。所以字串 catcatCatCAT 等匹配。

  1. starts_with() 函式從名稱的開頭匹配列名稱。
  2. ends_with() 函式從名稱末尾匹配列名稱。
  3. contains() 函式匹配列名的任何部分。

我們將在示例程式碼中使用預期返回至少兩個名稱的字串。我們可以檢查輸出以驗證該功能是否按預期工作。

示例程式碼:

# Look at the column names in our data frame.
names(dplyr_df)

# Four columns start with 'Col'. We will drop them.
dplyr_df %>% select(!starts_with('Col'))

# There are two column names that end with 'A'. We will drop them.
dplyr_df %>% select(!ends_with('A'))

# There are four column names that contain the string 'dplyr'.
# We will drop these four columns.
dplyr_df %>% select(!contains('dplyr'))

# We can give a vector of strings as an argument to these functions.
# We will drop columns that start with 'Co' or 'B'.
# 6 columns should get dropped.
dplyr_df %>% select(!starts_with(c('Co', 'B')))

第一個和最後一個命令的輸出:

> # Look at the column names in our data frame.
> names(dplyr_df)
[1] "Col1"    "Col2"    "Col7"    "Col8"    "dplyrA"  "dplyrAA" "Bdplyr"  "BBdplyr"

> dplyr_df %>% select(!starts_with(c('Co', 'B')))
  dplyrA dplyrAA
1    dA1     AA1
2    dA2     AA2
3    dA3     AA3

除了這三個函式之外,dplyr 還為正規表示式提供了另一個模式匹配輔助函式。

matches() 函式將正規表示式作為引數。預設情況下不區分大小寫。

例如,我們將刪除名稱中任何位置帶有 l 的列,後跟 7y。使用者需要熟悉正規表示式才能利用此功能。

示例程式碼:

dplyr_df %>% select(!matches('l+[7y]'))

輸出:

> dplyr_df %>% select(!matches('l+[7y]'))
  Col1 Col2 Col8
1   10   20   80
2   11   21   81
3   12   22   82

在 R 中使用 dplyr 刪除數字範圍內的列名

有時,我們可能有一個資料框,其列名以固定字串開頭並以數字結尾。dplyr 提供 num_range() 選擇幫助函式來幫助我們選擇和刪除共享公共字首並以指定數字範圍結尾的列。

為了說明,我們將首先建立一個包含六列的資料框。num_range() 的第一個引數是字首,第二個引數是用 : 運算子指定的數字範圍。

!運算子(補碼)幫助我們刪除選定的列。

示例程式碼:

# Create vectors of the same length.
MyVar10 = seq(1, 5)
MyVar11 = seq(6, 10)
MyVar12 = seq(11, 15)
MyVar13 = seq(16, 20)
MyVar14 = seq(21, 25)
MyVar15 = seq(26, 30)

# Combine the vectors into a data frame.
num_df = data.frame(MyVar10, MyVar11, MyVar12, MyVar13, MyVar14, MyVar15)
num_df

# Drop columns that end in the range 12 to 14.
num_df %>% select(!num_range('MyVar', 12:14))

最後兩個命令的輸出:

> num_df
  MyVar10 MyVar11 MyVar12 MyVar13 MyVar14 MyVar15
1       1       6      11      16      21      26
2       2       7      12      17      22      27
3       3       8      13      18      23      28
4       4       9      14      19      24      29
5       5      10      15      20      25      30
> # Drop columns that end in the range 12 to 14.
> num_df %>% select(!num_range('MyVar', 12:14))
  MyVar10 MyVar11 MyVar15
1       1       6      26
2       2       7      27
3       3       8      28
4       4       9      29
5       5      10      30

在 R 中使用 dplyr 使用函式刪除多列

where() 輔助函式將返回 TRUEFALSE 的函式應用於列資料。選擇函式返回 TRUE 的列。

像往常一樣,要刪除列,我們使用!運算子。

在示例中,我們使用一個簡單的自定義函式來選擇所有超過 10 的列。程式碼刪除這些並返回剩餘的列。

此示例程式碼有效,因為資料框中的所有列都是數字。對於真實的資料,該函式必須更加全面。

示例程式碼:

# Since all columns are numeric, there is no error.
# Otherwise, calculate the mean only for numeric columns.
num_df %>% select(!where(function(y) {mean(y)>10}))

輸出:

> num_df %>% select(!where(function(y) {mean(y)>10}))
  MyVar10 MyVar11
1       1       6
2       2       7
3       3       8
4       4       9
5       5      10

參考和幫助

dplyr 包是 Tidyverse 包集合的一部分。

select() 函式記錄在網頁使用其名稱和型別的子集列中。選擇助手功能都連結到這個網頁。

tidyselect 包構成 dplyr 選擇函式的後端。它的選擇語言網頁提供了更多詳細資訊和示例。

管道運算子 %>% 由 tidyverse 的 magrittr 包提供。

如果 select() 函式沒有按預期工作,我們必須驗證沒有其他載入的包具有 select() 函式。檢查是否是這種情況的一種快速方法是在使用函式時使用包名稱作為字首:dplyr::select()

如果它與包字首一起使用,我們有兩個選擇:始終使用字首或最後載入 dplyr(或 tidyverse)。稍後載入的包中的函式會遮蔽早期包中的同名函式。

有關 R Studio 中 R 函式的幫助,請單擊 幫助 > 搜尋 R 幫助,然後在搜尋框中鍵入函式名稱(不帶括號)。

或者,在 R 控制檯的命令提示符處鍵入一個問號,後跟函式名稱。例如,?select

まとめ

dplyr 包提供了許多選擇幫助函式和運算子,它們允許我們使用單行程式碼從資料框中刪除多個列。

我們使用補碼運算子!在所有情況下刪除選定的列。

作者: 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.