繁体   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