dplyr查找表/模式匹配

5

我希望能够以更加巧妙或“整洁”的方式,在tidyverse中使用查找表,但是却找不到令人满意的解决方案。

我有一个数据集和查找表:

# 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))

...其中查找表中的每一行都是我想要用来过滤第一个数据表(data)的精确模式。

期望的结果应该如下所示:

# 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))

然而,许多人经常这样做 - 是否有更清洁和更方便的方法来做这件事(例如,在您的查找表中使用超过两列)?


1
semi_join(data, lookup) ? - talat
过滤(data,医院 %in% 查找表$医院 & 患者 %in% 查找表$患者) - hplieninger
inner_join(data, lookup, by = c("hospital", "patients")) 但我想知道它是否真的更清晰和方便.. - MrSmithGoesToWashington
1个回答

5

由于dplyr :: inner_join()的默认行为是在传递给函数的两个tibbles之间的公共列上进行匹配,并且查找表仅包含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中的是不必要的。

另外,请注意,inner_join()是正确类型的连接,因为所需的输出是两个传入tibbles之间匹配的行,且查找表没有重复行。如果查找表包含重复行,则根据OP中的评论,semi_join()将是适当的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接