使用 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.