[英]How to order rows in dataframe with a new piping in r?
我想为这样的脚本使用新的 R pipe |> :
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),]
但是遇到了错误
错误:pipe 的 RHS 调用不支持 function '['
在这种情况下,如何使用 |> 过滤和排序 dataframe 中的行?
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
您可以使用[
作为 function 然后应用|>
运算符如下
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
另一种方法是编写一个可管道的 function 来代替[
在大多数情况下都可以使用,而不是逐个案例。 第一次尝试是DF <- function(x,...) x[...]
但这不是很好,因为括号内仍然需要df$
并且它指的是原始 data.frame,而不是管道. 所以,
DF <- function(x, ...) eval(substitute(x[...]), envir = x)
df |>
DF(letter != "c", ) |>
DF(order(number), )
这允许删除df$
并执行真正的 pipe。 结果是:
letter number
1 a 1
6 b 2
2 a 3
3 a 4
5 b 6
4 b 7
(这个想法来自 data.table package 的开发版本对 DT() function 所做的事情。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.