dplyr 查找 table / 模式匹配
dplyr lookup table / pattern matching
我一直在寻找一种聪明的或 "tidier" 方法来在 tidyverse 中使用查找 table,但找不到令人满意的解决方案。
我有一个数据集和查找 table:
# Sample data
data <- data.frame(patients = 1:5,
treatment = letters[1:5],
hospital = c("yyy", "yyy", "zzz", "www", "uuu"),
response = rnorm(5))
# Lookup table
lookup <- tibble(hospital = c("yyy", "uuu"), patients = c(1,5))
...查找中的每一行 table 都是我要过滤第一个小标题(数据)的确切模式。
想要的结果如下所示:
# A tibble: 3 x 4
patients treatment hospital response
<dbl> <chr> <chr> <dbl>
1 1.00 a yyy -0.275
2 5.00 e uuu -0.0967
我想到的最简单的解决方案是这样的:
as.tibble(dat) %>%
filter(paste(hospital, patients) %in% paste(lookup$hospital, lookup$patients))
但是,这一定是很多人经常做的事情 - 是否有更简洁、更方便的方式来做到这一点(即,在您的查找中超过两列 table)?
由于 dplyr::inner_join()
的默认行为是匹配传递给函数的两个 tibble 之间的公共列,并且查找 table 仅包含 2 个键列,最短的代码如下如下:
library(dplyr)
# Sample data
data <- tibble(patients = 1:5,
treatment = letters[1:5],
hospital = c("yyy", "yyy", "zzz", "www", "uuu"),
response = rnorm(5))
# Lookup table
lookup <- tibble(hospital = c("yyy", "uuu"), patients = c(1,5))
data %>% inner_join(.,lookup)
...输出:
> data %>% inner_join(.,lookup)
Joining, by = c("patients", "hospital")
# A tibble: 2 x 4
patients treatment hospital response
<dbl> <chr> <chr> <dbl>
1 1.00 a yyy -1.44
2 5.00 e uuu -0.313
>
因为所需的输出可以通过连接 tibbles 中的关键列来完成,所以 OP 中的 paste()
代码是不必要的。
另请注意,inner_join()
是正确的联接类型,因为所需的输出是在两个传入的 tibbles 之间匹配的行,并且查找 table 没有重复的行。如果查找 table 包含重复行,那么根据 OP 上的评论,semi_join()
将是合适的函数。
我一直在寻找一种聪明的或 "tidier" 方法来在 tidyverse 中使用查找 table,但找不到令人满意的解决方案。
我有一个数据集和查找 table:
# Sample data
data <- data.frame(patients = 1:5,
treatment = letters[1:5],
hospital = c("yyy", "yyy", "zzz", "www", "uuu"),
response = rnorm(5))
# Lookup table
lookup <- tibble(hospital = c("yyy", "uuu"), patients = c(1,5))
...查找中的每一行 table 都是我要过滤第一个小标题(数据)的确切模式。
想要的结果如下所示:
# A tibble: 3 x 4
patients treatment hospital response
<dbl> <chr> <chr> <dbl>
1 1.00 a yyy -0.275
2 5.00 e uuu -0.0967
我想到的最简单的解决方案是这样的:
as.tibble(dat) %>%
filter(paste(hospital, patients) %in% paste(lookup$hospital, lookup$patients))
但是,这一定是很多人经常做的事情 - 是否有更简洁、更方便的方式来做到这一点(即,在您的查找中超过两列 table)?
由于 dplyr::inner_join()
的默认行为是匹配传递给函数的两个 tibble 之间的公共列,并且查找 table 仅包含 2 个键列,最短的代码如下如下:
library(dplyr)
# Sample data
data <- tibble(patients = 1:5,
treatment = letters[1:5],
hospital = c("yyy", "yyy", "zzz", "www", "uuu"),
response = rnorm(5))
# Lookup table
lookup <- tibble(hospital = c("yyy", "uuu"), patients = c(1,5))
data %>% inner_join(.,lookup)
...输出:
> data %>% inner_join(.,lookup)
Joining, by = c("patients", "hospital")
# A tibble: 2 x 4
patients treatment hospital response
<dbl> <chr> <chr> <dbl>
1 1.00 a yyy -1.44
2 5.00 e uuu -0.313
>
因为所需的输出可以通过连接 tibbles 中的关键列来完成,所以 OP 中的 paste()
代码是不必要的。
另请注意,inner_join()
是正确的联接类型,因为所需的输出是在两个传入的 tibbles 之间匹配的行,并且查找 table 没有重复的行。如果查找 table 包含重复行,那么根据 OP 上的评论,semi_join()
将是合适的函数。