我想使用一个新的R管道|>对于这样的脚本:
df <- data.frame (letter=c(rep("a",3), rep("b",3), rep("c",2)),
number = c(1,3,4,7,6,2,5,8))
df <- df[which(df$letter !="c"),]
df <- df[order(df$number),]
我试过这个
df <- data.frame (letter=c(rep("a",3), rep("b",3), rep("c",2)),
number = c(1,3,4,7,6,2,5,8)) |>
df[which(df$letter !="c"),] |>
df[order(df$number),]
但是出现错误
错误:管道的RHS调用中不支持函数"[">
如何使用|>在这种情况下,要对数据帧中的行进行筛选和排序?
您可以使用[
作为函数,然后按如下应用|>
运算符
df <- df |> ((x)`[`(x,which(df$letter !="c") ,))()
df |> ((x)`[`(x,order(df$number) ,))()
- 输出
letter number
1 a 1
6 b 2
2 a 3
3 a 4
5 b 6
4 b 7
这里有一个替代建议。与提供的代码没有直接关系:
library(dplyr)
df |>
filter(letter != "c") |>
arrange(number)
letter number
1 a 1
6 b 2
2 a 3
3 a 4
5 b 6
4 b 7
另一种方法是编写一个可管道化的函数来使用,而不是在大多数情况下工作的[
,而不是根据具体情况。第一次尝试是DF <- function(x, ...) x[...]
,但这并不好,因为括号内仍然需要df$
,它指的是原始数据帧,而不是管道帧。所以,
DF <- function(x, ...) eval(substitute(x[...]), envir = x)
df |>
DF(letter != "c", ) |>
DF(order(number), )
这允许丢弃df$
并执行真正的管道。结果是:
letter number
1 a 1
6 b 2
2 a 3
3 a 4
5 b 6
4 b 7
(这个想法来自data.table包的开发版本对DT((函数的处理。(
此外,subset(letter != "c")
对第一部分很好,因此不需要额外的逗号。