使用两个条件进行子集

时间:2015-01-30 00:53:29

标签: r filter subset

我有一个包含两列的数据框

df <- data.frame(vec1 = c("a","b","c","d"), vec2 = c("2022","2011","2020","1246"))

DF

 vec1 vec2
   a  2022
   b  2011
   c  2020
   d  1246

我想用vec1&amp; vec2一起用于子集另一个数据帧以提取值。我希望从中看起来像

的子集的数据框
df1 <- data.frame(name=c(rep('a',4),rep('b',1),rep('c',5),rep('d',3),rep('e',2)), title=c(rep("2022",2),rep("201",2),rep("2011",1),rep("2020",5),rep("1246",1),rep("1256",2),rep("0000",2)))

DF1

  name title
1     a  2022
2     a  2022
3     a   201
4     a   201
5     b  2011
6     c  2020
7     c  2020
8     c  2020
9     c  2020
10    c  2020
11    d  1246
12    d  1256
13    d  1256
14    e  0000
15    e  0000

例如

subset(df1,df1$name%in%df$vec1 && df1$title%in%df$vec2)
  • 我要做的是“a”&amp;来自df的“2022”应与df1中的“a”和“2022”匹配,不应与“a”和“201”匹配。所有其他条目都应如此。

感谢。

4 个答案:

答案 0 :(得分:3)

简单合并可以很好地工作,因为它将匹配by=参数

中指定的所有列
merge(df, df1, by.x=names(df), by.y=names(df1))
#   vec1 vec2
# 1    a 2022
# 2    a 2022
# 3    b 2011
# 4    c 2020
# 5    c 2020
# 6    c 2020
# 7    c 2020
# 8    c 2020
# 9    d 1246

答案 1 :(得分:2)

data.table方法

library(data.table)
setkeyv(setDT(df1),names(df1))[df]
#    name title
#1:    a  2022
#2:    a  2022
#3:    b  2011
#4:    c  2020
#5:    c  2020
#6:    c  2020
#7:    c  2020
#8:    c  2020
#9:    d  1246

答案 2 :(得分:1)

您可以使用semi_join()中的dplyr

library(dplyr)
semi_join(df1, df, by = c("title" = "vec2", "name" = "vec1"))

filter()

df1 %>% filter(title %in% with(df, vec2), name %in% with(df, vec1))

答案 3 :(得分:0)

&是矢量化的(意味着它可以返回一个矢量),而&&则不能。由于您想要返回索引,因此必须使用&。您也不需要在subset函数调用中指定基础数据。

df <- data.frame(vec1 = c("a","b","c","d"), vec2 = c("2022","2011","2020","1246"))


df1 <- data.frame(name=c(rep('a',4),rep('b',1),rep('c',5),rep('d',3),rep('e',2)), title=c(rep("2022",2),rep("201",2),rep("2011",1),rep("2020",5),rep("1246",1),rep("1256",2),rep("0000",2)))


> subset(df1, name %in% df$vec1 & title %in% df$vec2)
   name title
1     a  2022
2     a  2022
5     b  2011
6     c  2020
7     c  2020
8     c  2020
9     c  2020
10    c  2020
11    d  1246