如何用r中的新管道对数据帧中的行进行排序



我想使用一个新的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")对第一部分很好,因此不需要额外的逗号。

最新更新