【发布时间】:2015-01-14 06:52:01
【问题描述】:
使用R 3.1.2、dplyr 0.4.0。
我正在尝试在filter 中使用filter,这听起来很简单,但我不明白为什么它没有给我预期的结果。这是我大约 6 个月前编写的代码,我相当确定它可以工作,所以它要么因为更新的 R 版本或 dplyr 或其他一些依赖关系而停止工作。无论如何,这里有一些简单的代码,它根据在 df2 的列上找到 filter 的条件过滤来自 df1 的行。
df1 <- data.frame(x = c("A", "B"), stringsAsFactors = FALSE)
df2 <- data.frame(x = "A", y = TRUE, stringsAsFactors = FALSE)
dplyr::filter(df1, x %in% (dplyr::filter(df2, y)$x))
我希望这会显示df1 的第一行,但我却得到了
# [1] x
# <0 rows> (or 0-length row.names)
我不知道该怎么做。为什么它返回一个向量和一个空的data.frame?
如果我将过滤器代码分成两个单独的语句,我会得到我所期望的
xval <- dplyr::filter(df2, y)$x
dplyr::filter(df1, x %in% xval)
# x
# 1 A
谁能帮我弄清楚为什么会发生这种行为?我不是说这是一个错误,但我不明白。
【问题讨论】:
-
我无法真正解释为什么,但就
dplyr语法而言,filter(df1, x %in% (filter(df2, y) %>% .$x))似乎更合适,并产生所需的输出 -
是的,我注意到这是可行的,但它似乎更冗长,对我来说可读性稍差(尽管这是有争议的)。但我会接受你的回答:) 你还回答了我一直有的另一个问题 - 提取列的正确 dplyr 方法是什么?我有时使用
filter(df2, y) %>% select(x) %>% as.character或filter(df2, y) %>% select(x) %>% first。 -
@RichardScriven,我假设您使用的是 dplyr 0.4.0?在 0.3.0.2 中它显然不起作用。另一种选择是
filter(df2, y) %>% select(x) %>% inner_join(df1) -
@docendodiscimus - 是的。其实今天才更新
-
@daattali FWIW:(1)当我运行时:
filter(df1, x %in% filter(df2, y)$x),我没有得到与你相同的输出,我得到一个错误:Error: incompatible expression in filter。 (2) 代码在data.tables:dt1 <- as.data.table(df1)上运行良好;dt2 <- as.data.table(df2);dt1 %>% filter(x == (filter(dt2, y)$x)),这可能表明data.frame版本中发生的事情是“未预料到的”。