[英]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.