如何在R中串联两列(或更多) - stringr, tidyr

1,863 阅读4分钟

在本指南中,你将学习如何在R中连接两列。事实上,你将学习如何在R中使用基础R(例如,使用粘贴函数)和Tidyverse(例如,使用str_c()unite() )合并多列。在本篇文章的最后一节,你将学习在合并列时使用哪个函数是最好的。

merge two columns

合并列

如果你有一些在R中使用数据框架(或者在这里是tibble)对象的经验,并且你准备学习如何组合在其中发现的数据,那么本教程将准确地帮助你做到这一点。

当你有一个包含两列信息的数据框架,而你想用R将这两列合并成一列时,知道如何做到这一点可能会很有用。在这种情况下,你可能想将这两列串联成一列,例如,称为 "姓名"。

three methods to concatenate two columns in R

在R中合并列的三种方法

你可以使用本教程末尾的交互式Jupyter笔记本来学习本教程中的例子。下面是我们用来学习如何将两列或更多列合并为一个变量的例子数据。

概要

在这篇文章中,你将通过实例学习如何在R串联两列。正如你所看到的,我们将使用R的$操作符来选择我们想要合并的列。这篇文章的大纲如下。首先,你将了解到你需要具备哪些条件来学习本教程。其次,你将得到一个关于如何合并两列的快速答案。在这之后,你将学习几个例子,使用1)paste() 和2)str_c() 和,3)unite() 。在本教程的最后一节,你将了解我更喜欢哪种方法以及为什么。也就是说,你会得到我的意见,为什么我喜欢unite() 函数。在下一节中,你将了解到本篇文章的要求。

要求

如果你喜欢使用基础R,你不需要更多的东西,只需要安装一个工作的R。然而,如果你要使用str_()unite(),你至少需要有stringr或tidyr这两个包中的一个。这里值得指出的是,这两个包都是Tidyverse包的一部分。这个包包含多个有用的R包,可用于读取数据、可视化数据(如用ggplot2绘制散点图)、在R中从日期中提取年份添加新列,以及其他一些事情。安装一个R包很简单,下面是你如何安装Tidyverse。

install.packages("tidyverse")

Code language: R (r)

注意,如果你想安装stringr或tidyr,只需将 "tidyverse "换成 "stringr "即可。 在下一节中,你将得到一个快速答案,没有任何细节,就是如何在R中连接两列。

我如何在R中连接两列?

要连接两列,你可以使用paste()函数。例如,如果你想合并数据框架df中的两列AB,你可以使用以下代码: df['AB'] <- paste(dfA,dfA, dfB).然而,请注意,使用paste将导致新列中的值之间出现空白。

在我们更详细地了解如何使用paste()来合并两列之前,我们将加载一个示例数据集。

从.xlsx文件中读取示例数据

下面是如何使用readxl包在R中读取一个.xlsx文件

# Importing Example Data:
library('readxl')
dataf <- read_excel("combine_columns_in_R.xlsx")

Code language: R (r)

现在,我们可以使用str() 函数来看看导入数据的结构。

the structure of the dataset

我们还将使用head() 函数快速查看前五行的情况。

First five rows of the dataset

现在,在上面的图片中,我们可以看到有5个变量和7个观测值。也就是说,在这个ibble中,有5列和7行。此外,我们可以看到变量的类型,当然,我们也可以使用列名。在下一节中,我们将首先使用paste()函数将月份和年份两列连接起来。

在R中串联两列

下面是使用paste() :函数在R中合并两列的最简单方法之一。

dataf$MY <- paste(dataf$Month, dataf$Year)

Code language: R (r)

在上面的代码中,我们用R中的$来1)创建一个新的列,但同时也选择了我们想合并成一个的两列。下面是带有新列的tibble,名为MY

Two columns concatenated in R

在下一个例子中,我们将合并两列并添加一个连字符("-")。 关于更多有用的运算符,以及如何使用它们,请参见 "如何在R中使用%in%。操作符的7个使用实例"。

在R中用"-"作为分隔符串联两列数据

现在,为了在我们想要合并的数值之间添加"-"(连字符),我们在paste() 函数中添加第三个参数。

dataf$MY <- paste(dataf$Month, "-", dataf$Year)

Code language: R (r)

在上面的代码例子中,我们使用了sep参数并将其设置为"-"。正如你所看到的,在下面的图片中,我们在两个值(即 "月 "和 "年")之间有空白。

现在,使用R的paste() 函数,我们可以添加另一个参数:sep参数。下面是一个合并两列的代码例子,加入了没有空格的"-"。

dataf$MY <- paste(dataf$Month, dataf$Year, sep= "-")

Code language: R (r)

注意,我们没有粘贴连字符,而是用它作为分隔符。 在继续下一个例子之前,值得指出的是,如果我们不想添加空格,我们可以使用paste0() 函数来代替。这样,我们就不需要sep参数了。在下一个例子中,我们将看看如何在R中合并多列(即三列或更多)。

在R中合并多列

正如你可能已经理解的那样,合并2个以上的列就像在paste() 函数中添加一个参数一样简单。下面是我们如何在R中结合三列。

dataf$DMY <- paste(dataf$Date, dataf$Month, dataf$Year)

Code language: R (r)

three columns concatenated in R

这也很简单。值得一提的是,如果你使用sep参数,在上述情况下,你最终会在每一列的每个值之间选择任何字符。例如,如果我们在上面的代码中加入sep参数,并将下划线("_")作为分隔符,那么产生的tibble会是这样的。

concatenate columns in R with underscore as separator

现在,你可能明白,使用sep参数可以使你使用几乎任何字符来分隔你的组合值。在下一节中,我们将看一下stringr包中的str_c()函数。

用str_c()函数在R中串联两列(stringr)。

用str_c()函数合并两列是超级简单的。下面是如何使用str_c()函数合并 "Snake "和 "Size "两列。

library(stringr)

dataf$SnakeNSize <- str_c(dataf$Snake," ", dataf$Size)

Code language: PHP (php)

注意到我们在想要合并的两列之间添加了一些东西吗?在使用这个函数时,我们需要这样做,否则我们最终会发现我们要合并的两个值之间没有任何分隔。如前所述,stringr包是Tidyverse包的一部分,该包还包括tidyr和unite()函数等包。在下一节中,我们也将使用unite()函数来合并R中的两列。

用unite()函数合并R中的列(tidyr)

下面是我们如何使用unite()函数连接两个或更多的列。

library(tidyverse) # or library(tidyr)

dataf <- dataf %>%
  unite("DM", Date:Month)

Code language: R (r)

注意上面的代码中的一些内容。首先,我们使用了一个新运算符(即%>%)。在很多事情中,这使我们能够使用unite(),而不用$运算符来选择列。正如你所看到的,在上面的代码例子中,我们使用了两个参数。首先,我们命名了我们想要添加的新列("DM"),其次,我们选择了从 "日期 "到 "月份 "的所有列,并将它们合并到新的列中。下面是产生的数据框架/提纲。

concatenate two columns in R with unite()

现在,正如你在上面的图片中看到的,我们合并的两列都消失了。如果我们想在合并后保留原来的列,我们可以将删除参数设置为FALSE。这里有一个代码块,你可以用它来代替,不删除这些列。

dataf <- dataf %>%
  unite("DM", Date:Month, remove = FALSE)

Code language: R (r)

最后,你注意到我们是如何用下划线作为分隔符的吗?如果我们想换成另一个分隔符,可以使用sep参数。这正是我们在下一个例子中要做的。

在R中使用"-"作为分隔符串联两个列

下面是我们如何使用unite()函数和sep参数,将分隔符改为"-"(连字符)。

dataf <- dataf %>%
  unite("DM", Date:Month, sep= "-", 
        remove = FALSE)

Code language: R (r)

这和前面的例子一样简单,对吗?在下一节中,你将了解我更喜欢使用哪个函数以及为什么。

哪个函数最适合在R中串联列?

自然,本节将包含我的观点。我没有做过任何优化测试(例如,我不知道在R中合并列时哪个函数是最快的)。也就是说,尽管这篇文章中使用的所有函数都很简单,但我更喜欢unite()函数。为什么呢?嗯,与管道运算符一起,我认为它使列的可读性很强。正如你可能已经注意到的,在上面的例子中,我们可以在合并列时使用":"。这意味着我们可以从第一列(即列号的左边)到最后一列(即": "的右边)合并多个列。这相当整洁,肯定会在你的代码中节省一些空间,并使其更容易阅读!

how to concatenate two columns in R

在R中串联两列

另一个整洁的地方是,我们把新的列名作为一个参数来添加,并且我们,自动摆脱了列的组合(如果我们不需要它们,当然,以后)。最后,如果我们想在合并数值之前去除缺失的数值,我们也可以将na.rm参数设置为 "true"。这里是一个包含本帖所有代码的Jupyter笔记本

总结

在这篇文章中,你已经学会了如何使用三个不同的函数在R中连接两个(或更多)列。首先,我们使用了基础R的paste()函数。使用这个函数,我们合并了两列和三列,将分隔符从空白处改为连字符("-")。第二,我们使用str_()函数来合并列。第三,我们使用unite()函数。当然,使用最后两个函数改变分隔符也是可能的(我们看到了一些例子)。总而言之,unite()函数似乎是R语言中用来连接列的最方便的函数。

最后,如果你有任何建议、其他意见,或者有你希望我涉及的内容:不要犹豫,请联系我。