首页 > 解决方案 > R:通过“包含”行名称中的文本过滤行

问题描述

我正在使用 R 中的 mtcars 数据集。我的任务是使用 knitr::kable() 打印与本田和丰田卡对应的行。我被定向到此寻求帮助:https ://r4ds.had.co.nz/r-markdown.html#table

然而,该部分只讨论了打印数据集的前 5 行,根本没有讨论过滤它。我单击以阅读有关该功能的更多信息,但这对我来说都是陌生的。

我能说的最好的就是汽车的品牌和型号是行名。所以我需要过滤结果以仅打印名称包含“Honda”或“Toyota”的行,我需要使用 knitr::kable() 来完成。

我尝试过创建子集,但不确定如何使用行名来创建子集。也不知道如何搜索行名是否包含文本“Honda”或“Toyota”。

这是我使用 R 的第一天,而在今天之前,我唯一的编码经验是两年前的一些 C#。这对我来说非常令人沮丧,因为我可以在不到 30 秒的时间内在 Excel 中完成此操作。但是 R 就像一门外语,我不觉得我的教科书部分解释了这个问题 - 特别是对于一个全新的编码器(而且这门课不应该需要任何经验)。感谢我能得到的任何帮助!

标签: rfilterkable

解决方案


加载需要的库

首先加载tidyverse ,因为下面的代码使用了这个包中的一些有用的功能。也许包喜欢rmarkdownknitr需要加载。

library(tidyverse)

1.在索引列中按rownames过滤行

mtcars是数据框类型的变量,也是R 中的内置数据集之一Motor Trend Car Road Tests 数据集包含 1971 年杂志收集的汽车的 11 个方面(见本文末尾的表格)。

TL;DR 总结

filter使用和过滤数据框的行,grepl通过将其与正则表达式进行比较来查找命名索引列中的所有匹配项Honda|Toyota

filtered_cars <- mtcars %>%
  filter(!grepl("Honda|Toyota", rownames(mtcars)))

深度解释:

汽车数据通过管道传输到函数dplyr::filter()中,以仅提取满足所有给定条件的行的子集。这个条件是用一个数据掩码表达式作为函数参数给出的。对于这个表达式,我们使用grep和正则表达式Honda|Toyota。由于汽车的名称不在常规数据列中,因此无法使用mtcars$gear. 因此rownames(mtcars)必须使用获取索引列中名称的向量。这个管道表达式的结果被分配给filtered_cars变量。

只需查看生成的数据帧的计数,就会发现有几行已被删除:

mtcars %>% count() # 32
filtered_cars %>% count() # 29

2.将数据框打印为markdown格式的表格

knitr::kable(
  filtered_cars[1:5,], 
  caption = "A table in a markdown document (subset of mtcar data set)"
)

输出:

|                  |  mpg| cyl| disp|  hp| drat|    wt|  qsec| vs| am| gear| carb|
|:-----------------|----:|---:|----:|---:|----:|-----:|-----:|--:|--:|----:|----:|
|Mazda RX4         | 21.0|   6|  160| 110| 3.90| 2.620| 16.46|  0|  1|    4|    4|
|Mazda RX4 Wag     | 21.0|   6|  160| 110| 3.90| 2.875| 17.02|  0|  1|    4|    4|
|Datsun 710        | 22.8|   4|  108|  93| 3.85| 2.320| 18.61|  1|  1|    4|    1|
|Hornet 4 Drive    | 21.4|   6|  258| 110| 3.08| 3.215| 19.44|  1|  0|    3|    1|
|Hornet Sportabout | 18.7|   8|  360| 175| 3.15| 3.440| 17.02|  0|  0|    3|    2|
...

推荐阅读