【问题标题】:R filter rows : where clause : from dataframeR过滤行:where子句:来自数据框
【发布时间】:2015-02-09 09:42:11
【问题描述】:

我正在尝试按如下方式过滤 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 loop ?非常感谢!

【问题讨论】:

  • 我猜你想要 %in% udf[['A']] ,即向量而不是子列表。
  • 哦耶!非常感谢!我的(真正的小)坏!

标签: r select filter dplyr


【解决方案1】:

您可以简单地 pip 数据并使用 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)

【讨论】:

    【解决方案2】:

    您可以使用 inner_join 中的 dplyr

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

    或者使用@BondedDust 评论的filter

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

    【讨论】:

      猜你喜欢
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2012-12-25
      相关资源
      最近更新 更多