R过滤行:where子句:来自dataframe

时间:2014-12-11 01:19:24

标签: r select filter dplyr

我正在尝试按如下方式过滤R中的数据帧。

让mydf成为具有两列A和B的数据帧。

让udf成为另一个具有1列A的数据帧。

我想做以下事情。

Select rows from mydf where mydf[A] is in udf[A]

我正在使用dplyr并在行上尝试了一些

T = filter(mydf, A %in% udf['A'])

这显然不起作用。有没有明确写入for循环的直接解决方法?非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以使用inner_join

中的dplyr
library(dplyr)
r1 <- inner_join(mydf, udf, by='A')

或使用filter评论@BondedDust

r2 <- filter(mydf, A %in% udf[['A']])
identical(r1, r2)
#[1] TRUE

或使用data.table

library(data.table)
setkey(setDT(mydf),A)[udf, nomatch=0]

数据

set.seed(24)
mydf <- as.data.frame(matrix(sample(1:10,2*10, replace=TRUE),
    ncol=2, dimnames=list(NULL, LETTERS[1:2])) )
set.seed(29)
udf <- data.frame(A=sample(1:10,6,replace=TRUE))

答案 1 :(得分:0)

您可以简单地点击数据并使用left_join功能。 这是一个可重现的例子:

数据:

set.seed(123)
colors<- c( rep("yellow", 5), rep("blue", 5), rep("green", 5) )
shapes<- c("circle", "star", "oblong")
numbers<-sample(1:15,replace=T)
group<-sample(LETTERS, 15, replace=T)
mydf<-data.frame(colors,shapes,numbers,group)
mydf

mydf2<- mydf %>%  
    filter (colors=="yellow")

 mydf3 <- mydf %>% left_join(mydf2)