簡體   English   中英

如何使用 r 中的新管道訂購 dataframe 中的行?

[英]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) ,))()

  • output
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM