【问题标题】:Subsetting/filtering using brackets and pipes in R使用R中的括号和管道进行子集/过滤
【发布时间】:2020-10-19 15:59:17
【问题描述】:

我无法让管道和括号[] 一起工作。我怀疑我不了解管道的工作原理。

我正在尝试使用括号和管道来回答以下问题: 1952 年最富有的国家叫什么名字? (数据来自包gapminder

我试过了:

1. df[df$year == 1970,] %>% df[df$money == max(df$money),]["country"]

2. df %>% filter(year=="1970") %>% df[df$money == max(df$money),]["country"]

3. df %>% filter(year=="1970") %>% filter(money == max(df$money))

在没有管道的情况下使用它 - 所有线路单独工作。我不是在寻找解决问题的另一种方法,而是更好地理解管道和支架,并使用它们来解决问题。 对于 1. 和 2。我收到错误消息 Error in xj[i] : invalid subscript type 'list',而对于 3,我得到一个让我困惑的空数据框。

【问题讨论】:

  • 您的问题是在 1952 寻找最富有的国家。为什么使用条件year == 1970?在 gapminder 数据帧中,没有 1970。因此,无论您尝试什么过滤器,结果仍然会得到一个零行数据帧。
  • 我实际上是在寻找 1952,这篇文章中的 1970 是一个错误。也不适用于 1952 年。不过很好看

标签: r filter pipe brackets


【解决方案1】:

有几种不同的方法可以解决这个问题,它们更具可读性。但是,如果您想使用管道和括号来了解它们是如何工作的,那么下面的代码应该可以做到这一点。你快到了。您可以使用“。”操作符,表示要结转的管道之前最后一个进程的输出

df[df$year == 1970,] %>% 
  .[.$money == max(.$money),] %>% 
  .["country"]

【讨论】:

  • 谢谢 - 很高兴它有帮助 - 请您接受该解决方案,以便将来有类似问题的用户被引导到它。
【解决方案2】:

我想你快到了。

试试这个:

df %>% filter(year == 1970) %>% filter(money == max(money))

您不需要df$ 部分。最后一个选项可能返回并清空 df,因为总数据框中的最高金额是在 1970 年以外的年份观察到的。而且年份可能是数字,所以应该不带引号使用。

【讨论】:

  • 这是一个很好的答案 - 谢谢。但是,它并没有让我更接近理解为什么其他两种解决方案不起作用。这对我来说是一个反复出现的问题。你知道 1. 和 2. 有什么问题吗?
  • 我认为在另一个答案中有解释。在管道中,您将某个数据帧转发到下一个函数。在这种情况下,您可以将[] 视为一个函数。所以如果你在第一个管道之前以df开头,你不需要在第一个管道之后再次引入它,因为管道在管道之前继承了函数的输出。如果你想使用括号和管道的组合(有点奇怪)你需要引入.。这是一个不错的章节:moderndive.com/3-wrangling.html
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 2020-04-26
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多