The post How to Remove/Delete a Row in R - Rows with NA, Conditions, Duplicated appeared first on Erik Marsja .
在本教程中,你将学习1)如何在
R
中删除一行,以及2)如何在R中删除多行。当然,R是一种多功能的编程语言,当我们需要删除一行时,有许多不同的选择。例如,如果我们想根据一个条件来删除一行,我们可以使用
subset()
函数。如果我们喜欢使用Tidyverse软件包,我们可以使用
filter()
,根据某一列的值来删除(或选择)行(有条件地,也就是和使用subset一样)。此外,我们还可以使用dplyr中的函数
slice()
,根据索引来移除行。
在这篇文章中,我们将通过以下方式在R编程环境中删除行。
slice()
subset()
函数
filter()
函数
注意,在本篇文章的大多数例子中,我们将使用数据帧(或二进制)。然而,在适当的时候,同样的方法也会用在矩阵上。也就是说,你将学习如何从矩阵和数据框架中删除一行。在下一节中,我们将介绍本教程所需要的内容。以下是本R教程的内容表。
要学习本教程,你需要具备的条件不多。当然,如果你想使用示例数据集,你需要下载它,并确保你的R环境设置为与数据文件的位置相同的环境(或者你需要知道文件的路径)。在R中设置工作目录可以用
setwd()
函数来完成。
此外,如果你想使用dplyr,你要么需要安装
Tidyverse
,要么只安装dplyr包。安装R包可以用
install.packages()
函数来完成。安装Tidyverse是通过这个命令完成的。
install.packages("tidyverse")
值得注意的是,在这里,Tidyverse附带了很多伟大的软件包。例如,使用dplyr你可以在R中选择一个列,tibble(和dplyr)使你能够使用R向数据中添加一个列,以及其他一些东西。也就是说,安装TIdyverse是非常值得的。
现在,在我们继续讨论如何在R中删除一行的例子之前,我们将快速回答一些常见问题。 这些问题可能已经把你带到了这里,也可能是你所需要的一切。
如何在R语言中删除一行?
要在R语言中删除一行,你可以使用-操作符。例如,如果你想从R的数据框架中删除第一行,你可以使用以下代码:dataFrame <- dataFrame[-1, ]
。这段代码将从数据框架中删除第一行。 当然,如果你需要删除多行,你可以使用向量函数添加它们: dataFrame <- [-c(1, 2, 3),]
在我们要在R中从数据框中删除一行之前,我们需要一些数据来练习。这些数据存储在一个Excel文件中,你需要在读取它之前将其下载到你的电脑上(见要求部分)。下面是你如何使用readxl包在R中读取一个xlsx文件。
library(readxl)
dataf <- read_excel("example_sheets2.xlsx")
head(dataf)
这里是这个数据框架的前6行。
如果我们想知道更多关于数据的信息,我们也可以使用str()
函数。
从上面的图片中可以看出,该数据有10行5列(这个信息也可以用dim()
函数得到)。此外,我们可以看到不同变量(列)的数据类型。在下一节中,我们将使用其索引在R中删除一条行。
如何通过索引删除R语言中的一行
下面是你如何在R基础上使用其索引删除一行。
dataf[-2,]
正如你在输出中看到的,我们得到了一个9乘5的矩阵,因此,已经成功地从数据框中删除了第二行。然而,如果我们希望它是永久性的,我们需要将数据框架分配给一个新的(或覆盖旧的)。 下面是我们如何做到这一点。
dataf <- dataf[-2,]
在下一节中,我们将从一个矩阵中删除一条行。
如何在R中从一个矩阵中删除一行
如前所述,我们将看到如何从矩阵中删除行,只要我们用于数据框架的相同方法适用即可。首先,这里是如何在R中创建一个矩阵。
mtx <- matrix(seq(1,9), nrow = 3,
ncol = 3)
在上面的代码块中,我们使用matrix()
函数创建了一个矩阵。另外,我们使用 seq在R中创建了一个数字序列。接下来,我们可以使用与前面例子相同的方法删除第一行。
mtx[-1, ]
同样,如果我们想在没有删除行的情况下使用我们的数据,我们需要将其分配给一个新的(或覆盖旧的)矩阵。注意,在R中也可以将矩阵转换为数据帧。在下一个例子中,我们将使用dplyr中的slice()
函数,按照索引删除一行。
如何使用dplyr的slice()函数在R中分两步删除一行
在本节中,我们准备使用其他函数在R中删除行。以下是使用slice()函数的两个简单步骤。
1.加载dplyr
第一步当然是加载软件包。这是用library()
函数完成的。
library(dplyr)
2.使用slice()函数
现在我们已经准备好使用其索引删除一行。下面是我们如何使用slice()
函数来做。
slice(dataf, 1)
注意我们如何使用数据框架作为第一个参数,然后我们使用"-"号和我们想要删除的行的索引。在这个例子中,我们删除了第一行。在继续下一个例子之前,值得指出的是,slice()
函数不能用于矩阵。
在接下来的两个例子中,我们将学习如何使用base R和slice()
函数来删除多行。
如何使用基础R删除行
在这个例子中,我们将通过索引删除多行。当然,这与删除单行的方法类似。但是,我们需要使用c()
函数。下面是我们如何在R中按索引删除4条记录。
dataf[-c(1, 3, 5, 7),]
在上面的代码块中,我们再次使用了括号("[]
")。在括号内,我们进一步使用了c()
函数。在这个函数中,我们添加了我们想从数据框架中删除的行的索引。请注意,我们再次在c()
前面使用了"-"。如果你正在处理一个矩阵,同样可以应用完全相同的方法来从矩阵中删除行。
mtx[-c(1, 3, 4),]
同样,请记住将数据框架分配给一个新的变量,否则,如果没有删除的行,你就无法使用你的数据。
在下一个例子中,我们将使用slice()
函数(dplyr)来从R中的数据框架中删除行。
如何使用R语言中的Slice()函数删除行
在前面的例子中,我们学习了使用slice()
函数来删除行的两个步骤。当然,在使用dplyr删除多条记录时,同样的两个步骤也是有效的。事实上,我们的工作方式与之前的例子很相似。也就是说,我们在slice()
函数中使用c()
函数来从数据框架/tibble中删除多条记录。
slice(dataf, -c(1, 3, 5), ]
当然,我们需要将删除的行分配到新的数据框中。在接下来的两个例子中,我们将进入在R中删除行的更高级的方法。首先,我们将学习如何使用subset()
函数根据一个条件来删除行。其次,我们将使用dplyr包中的filter()
函数做同样的事情。当然,我们也会看一下使用多个条件删除行的例子。
如何根据条件在R中删除一行
有时候,我们需要根据一个列的值来删除数据中的某一行。例如,我们可能知道某个参与者希望被排除在数据分析之外。另一个例子是,我们想对数据的一个子集进行分析。在任何情况下,这里是我们如何有条件地使用subset()
函数来删除一行的。
subset(dataf, Name != "Steve")
在上面的代码块中,我们使用了subset函数,将数据框架作为第一个参数。接下来是我们的条件。在这个例子中,我们要删除名字为 "Steve "的那一行。现在,这可能看起来有点落后,实际上我们正在做的是选择所有不存在 "Steve "这个名字的行。这将给我们提供这个数据框架。
当然,在大多数情况下,我们可能想根据多个条件来删除行。不要担心,我们将对此进行研究,但首先,我们将使用dplyr中的filter()
函数来完成上述相同的结果。
使用filter()dplyr根据列单元格中的一个值删除一个行
下面是我们如何使用filter()
函数根据一个条件删除一行。
filter(dataf, Name != "Pete")
在上面的示例代码中,我们删除了 "姓名 "列中有 "Pete "的行。同样,我们实际做的是选择除了这一行以外的所有其他行。
当然,我们很可能想根据多个条件来删除某一行(或几行),我们也将很快学会如何做到这一点。首先,我们学习如何使用subset()
函数来实现这一目的。其次,我们使用dplyr包中的filter()
函数。
在R中根据条件删除行
现在,正如前面提到的,很多时候我们可能想根据许多条件来删除某一行(或几行)。下面是一个关于如何使用subset()
函数的多个条件的示例代码。
subset(dataf, Mean != 99 & Correct != 99)
在上面的例子中,我们在subset()
函数中使用了和运算符。然而,首先,我们使用数据框架(即dataf)作为第一个参数。第二个,是我们添加条件的地方。正如你所看到的,在上面的代码块中,&是和运算符。在这里,我们选择了所有不包含指定值的行(在我们的例子中是数字X和Y)。在下一个例子中,我们将看到如何使用软件包dplyr中的filter()
函数来执行同样的任务。
使用filter()函数根据条件删除行
当然,基于多个条件的删除行也可以用非常类似的方式使用filter()
函数来完成。
filter(dataf, Mean != 99 & Correct != 99)
在上面的代码块中,我们基本上只是将subset()
函数改为filter()
函数。然而,在使用dplyr和Tidyverse软件包时,我们可以利用%>%操作符来实现这样的数据管道。
dataf <- dataf %>%
filter(Mean != 99 & Correcft != 99)
在下一节中,你将学习如何删除缺失值的行。然而,首先,我们需要在当前的数据框中添加一些缺失值。
如何在R中删除所有缺失值(NA)的行
有时我们需要从数据中删除缺失值。在R语言中,我们可以使用na.omit()
函数删除有缺失值的行。然而,首先,我们要在我们的实践数据框架中添加一些缺失值。
dataf_na <- dataf
dataf_na$Correct[c(4, 7)] <- NA
dataf_na$Mean[c(2, 3)] <- NA
在上面的代码块中,我们在正确栏的第4行和第7行以及平均值栏的第2行和第3行中添加了缺失值。接下来,我们可以使用na.omit()
函数来删除这些缺失的值。下面是我们如何从我们的数据框架中删除NA。
dataf_na <- na.omit(dataf_na)
在下一节中,我们将快速了解一下如何删除重复的行。
如何删除R中的重复行
在这最后一个例子中,我们将在R中删除重复的行。
dataf2 <- rbind(dataf, dataf[1,])
dataf2[!duplicated(dataf2), ]
正如你在上面的代码块中看到的,我们首先创建了两个重复的行,然后,我们使用了 duplicated() 函数。请注意我们在Doubleicated()函数之前使用了!。我们这样做是为了不让我们得到重复的行。如果忽略这一点,我们就会得到重复的行。关于从数据中删除重复行的更多信息,请参见关于在R中删除 重复行的文章。
在这篇文章中,你已经学会了如何使用基础函数和dplyr包中的函数在R中删除一条记录。此外,你还学会了如何在R中的数据框架和矩阵上执行这项任务。具体来说,你现在已经学会了通过行的索引来删除行。此外,你还学会了如何使用行索引来删除多条记录。在这两个例子中,删除多行也是使用基础R和dplyr(slice())完成的。由于我们有时想根据一个(或两个)条件删除一行,你也已经学会了如何使用subset()和filter()函数根据一个条件删除一行。后者也是一个dplyr函数。最后,我们又经历了两个例子,首先删除了有缺失值的行,然后是有重复值的行。