gpt4 book ai didi

r - 在 dplyr 中使用过滤器内的过滤器会产生意想不到的结果

转载 作者:行者123 更新时间:2023-12-01 00:56:02 34 4
gpt4 key购买 nike

使用 R 3.1.2 , dplyr 0.4.0 .

我正在尝试使用 filterfilter 内,这听起来很简单,我不明白为什么它没有给我预期的结果。这是我大约 6 个月前编写的代码,我相当确定它可以工作,所以它要么因为更新的 R 版本而停止工作,要么 dplyr或其他一些依赖。无论如何,这里有一些简单的代码,它根据 filter 找到的条件过滤来自 df1 的行。在 df2 的列上。

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

谁能帮我弄清楚为什么会发生这种行为?我不是说这是一个错误,但我不明白。

最佳答案

这是一个有效的问题,为什么您的方法不起作用(显然不再起作用)。我无法回答这个问题,但我会建议一种不同的方法,如上所述,它避免了嵌套函数调用( filter 在另一个 filter 中),IMO 是 dplyr 的用途:通过易于阅读来表达并理解语法,从左到右,从上到下。

因此,对于您的示例,因为您感兴趣的列都命名为“x”,您可以这样做:

filter(df2, y) %>% select(x) %>% inner_join(df1)
  • 按“y”列过滤df2数据
  • 仅选择列“x”
  • 在公共(public)列(“x”)上使用 df1 执行 inner_join。 inner_join 的意思是:“返回 x 中在 y 中有匹配值的所有行,以及 x 和 y 中的所有列。”

  • 如果它们不同,例如“z”和“x”,您可以使用:
    filter(df2, y) %>% select(x) %>% inner_join(df1, by = c("z" = "x"))

    正如 Hadley 在下面的评论中所指出的,使用 semi_join 会更安全。而不是 inner_join这里。文档说:

    semi_join: return all rows from x where there are matching values in y, keeping just columns from x.

    A semi join differs from an inner join because an inner join will return one row of x for each matching row of y, where a semi join will never duplicate rows of x.



    因此,您可以对示例案例执行以下操作:
    filter(df2, y) %>% select(x) %>% semi_join(df1)

    关于r - 在 dplyr 中使用过滤器内的过滤器会产生意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27937273/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com