Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何通过在第二个数据帧中列出的任意标识符进行过滤?_R_Dplyr - Fatal编程技术网

R 如何通过在第二个数据帧中列出的任意标识符进行过滤?

R 如何通过在第二个数据帧中列出的任意标识符进行过滤?,r,dplyr,R,Dplyr,我经常发现自己有一系列表示我想分析的特定实验的唯一标识符。为了加快通过这些实验创建数据子集的过程,我开始将这些列表存储在单独的表中。这些唯一标识符的组合经常变化,这取决于我正在分析的数据类型,虽然我知道我每次都可以编写这样的函数: library(dplyr) filter_xy <- function(data, look) { base <- look %>% mutate(id__ = paste0(x,y)) %>% distinct() data %&g

我经常发现自己有一系列表示我想分析的特定实验的唯一标识符。为了加快通过这些实验创建数据子集的过程,我开始将这些列表存储在单独的表中。这些唯一标识符的组合经常变化,这取决于我正在分析的数据类型,虽然我知道我每次都可以编写这样的函数:

library(dplyr)
filter_xy <- function(data, look) {
  base <- look %>% mutate(id__ = paste0(x,y)) %>% distinct()
  data %>%
    mutate(id__ = paste0(x,y)) %>%
    filter(id__ %in% base$id__) %>%
    select(-id__)
}
我一直想弄明白,但我还不太理解非标准评估。我想应该是这样,但我不确定

filter_id <- function(data, look, ...) {
  id <- c(...)
  base <- look %>%
    mutate_(.dots = setNames(list(interp( ~ paste0(id))), "id__")) %>%
    distinct()
  data %>%
    mutate_(.dots = setNames(list(interp( ~ paste0(id))), "id__")) %>%
    filter(id__ %in% base$id__) %>%
    select(-id__)
}
test.csv

g,h
a,a
a,b
b,a
b,b
c,a
c,b
c,c
c,d
g,h,x,y
a,a,1,10
a,a,2,8
a,b,1,10
a,b,2,8
a,b,3,7
a,c,1,10
a,c,2,9
a,c,3,8
a,c,4,8
a,d,1,10
a,d,2,9
a,d,3,8
a,e,1,10
a,e,2,10
a,e,3,10
b,a,1,10
b,a,2,3
b,b,1,10
b,b,2,5
b,c,1,10
b,c,2,10
b,c,3,10
b,d,1,10
b,d,2,10
c,a,1,10
c,a,2,8
c,b,1,10
c,b,2,9
c,b,3,8
c,b,4,8
c,c,1,10
c,c,2,4
c,d,1,10
d,a,1,10
d,a,2,9
d,a,3,8
d,b,1,10
d,b,2,10
d,b,3,10
d,c,1,10
d,c,2,9
d,c,3,9
d,d,1,10
d,d,2,10
我要编写的代码是将
test.csv
数据子集到
lookup.csv
数据中的列中,代码如下:

lookup <- read_csv("lookup.csv")
test <- read_csv("test.csv")
test %>% filter_id(lookup, g, h)
结果是:

       g     h     x     y
   (chr) (chr) (int) (int)
1      a     a     1    10
2      a     a     2     8
3      a     b     1    10
4      a     b     2     8
5      a     b     3     7
6      b     a     1    10
7      b     a     2     3
8      b     b     1    10
9      b     b     2     5
10     c     a     1    10
11     c     a     2     8
12     c     b     1    10
13     c     b     2     9
14     c     b     3     8
15     c     b     4     8
16     c     c     1    10
17     c     c     2     4
18     c     d     1    10

我想您真的只想使用正确的列(
g
h
)进行一次
?半联接

半自动连接

从x返回y中有匹配值的所有行, 只保留x的列

半联接与内部联接不同,因为内部联接将 为y的每个匹配行返回一行x,其中半联接将 永远不要重复x的行

举个例子,那就是:

filter_gh <- function(data, look) {
  base <- look %>% mutate(id__ = paste0(g,h)) %>% distinct()
  data %>%
    mutate(id__ = paste0(g,h)) %>%
    filter(id__ %in% base$id__)
}
semi_join(test, lookup, by = c("g", "h"))
#   g h x  y
#1  a a 1 10
#2  a a 2  8
#3  a b 1 10
#4  a b 2  8
#5  a b 3  7
#6  b a 1 10
#7  b a 2  3
#8  b b 1 10
#9  b b 2  5
#10 c a 1 10
#11 c a 2  8
#12 c b 1 10
#13 c b 2  9
#14 c b 3  8
#15 c b 4  8
#16 c c 1 10
#17 c c 2  4
#18 c d 1 10

如果您将数据存储为
因子
变量,则可能会出现警告。

更简单的思考方法。谢谢!我没有想过使用任何
*\u join
函数。
semi_join(test, lookup, by = c("g", "h"))
#   g h x  y
#1  a a 1 10
#2  a a 2  8
#3  a b 1 10
#4  a b 2  8
#5  a b 3  7
#6  b a 1 10
#7  b a 2  3
#8  b b 1 10
#9  b b 2  5
#10 c a 1 10
#11 c a 2  8
#12 c b 1 10
#13 c b 2  9
#14 c b 3  8
#15 c b 4  8
#16 c c 1 10
#17 c c 2  4
#18 c d 1 10