我有一个包含两列的数据框
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)
感谢。
答案 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