【问题标题】:Ways to select multiple columns in base R using the native pipe |>?使用本机管道 |> 在基础 R 中选择多个列的方法?
【发布时间】:2022-04-26 03:16:21
【问题描述】:

使用原生管道 |> 在 base R 中选择数据框的多列的好方法是什么? (即,没有 tidyverse/dplyr 来减少外部依赖)。

如果我们有数据框

dtf <- data.frame(a = 1:3, b = 4:6, c = 7:9)

然后我们可以选择列 b 和 c

> dtf[c("b", "c")]
  b c
1 4 7
2 5 8
3 6 9

使用原生管道在 tidyverse 中执行此操作的一种优雅方式是

> dtf |> dplyr::select(b, c)
  b c
1 4 7
2 5 8
3 6 9

我对原生管道的最佳基础 R 尝试是

> dtf |> subset(select = c("b", "c"))
  b c
1 4 7
2 5 8
3 6 9

一个更简洁(但失败的尝试)是

> dtf |> `[`(c("b", "c"))
Error: function '[' not supported in RHS call of a pipe

有没有我想念的更好的方法来做到这一点?

注意:如果您只想要一列并且可以放入向量中,那么可以使用getElement

> dtf |> getElement("b")
[1] 4 5 6

【问题讨论】:

  • subset 的规范用法更优雅的东西吗?不,这是基本 R 中的最佳方法。(顺便说一句,您可以使用 X &lt;- `[`'; dtf |&gt; X(c("b", "c")) 作为基本 R 不希望您在这样的管道中使用 `[` 的解决方法。由 data.table#4872 中的评论建议。)
  • 看看这里stackoverflow.com/questions/67799890/…>

标签: r dataframe dplyr


【解决方案1】:

这是一种方法:

dtf |> (\(x) `[`(x, c("b", "c")))()
#  b c
#1 4 7
#2 5 8
#3 6 9

您必须使用匿名函数\(x) 并将其作为参数传递给[。不要忘记以括号 () 结尾。

【讨论】:

  • 感谢@Rui 阐明如何使用新的匿名函数语法来做到这一点。很有启发性。
【解决方案2】:

只需将括号括起来:

dtf |> (`[`)(c("b", "c"))
#  b c
#1 4 7
#2 5 8
#3 6 9

或打电话给::

dtf |> base::`[`(c("b", "c"))
#  b c
#1 4 7
#2 5 8
#3 6 9

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多