如何在 r 中将许多命令变成一个管道命令?

How to turn many commands into one pipe command in r?

我是管道 %>% 操作员的新手。有人能告诉我是否(如果是,如何)我可以将它变成一个或两个管道命令吗?

b2m <- b$bdi.2m-b$bdi.pre
b2m %>%
  as.vector(mode = "any")
b2m <- b2m[!is.na(b2m)]
b2m <- b2m^2 
b2m <- sum(b2m)/length(b2m)
b2m

当我尝试在第 3 行之后恢复管道时,我总是遇到索引错误。

编辑:

> dput(head(b))
structure(list(drug = structure(c(1L, 2L, 2L, 1L, 2L, 2L), .Label = c("No", 
"Yes"), class = "factor"), length = structure(c(2L, 2L, 1L, 2L, 
2L, 1L), .Label = c("<6m", ">6m"), class = "factor"), treatment = structure(c(1L, 
2L, 1L, 2L, 2L, 2L), .Label = c("TAU", "BtheB"), class = "factor"), 
    bdi.pre = c(29, 32, 25, 21, 26, 7), bdi.2m = c(2, 16, 20, 
    17, 23, 0), bdi.3m = c(2, 24, NA, 16, NA, 0), bdi.5m = c(NA, 
    17, NA, 10, NA, 0), bdi.8m = c(NA, 20, NA, 9, NA, 0)), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame")
b %>% summarise(b2m = sum((bdi.2m - bdi.pre)^2, na.rm = T)/length(bdi.2m))

你可以用管道做你想做的事。您遇到的问题是管道将上一行的结果作为函数的第一个参数,因此它不适用于 b2m[!is.na(b2m)] 之类的东西,因为它不是函数(该函数在 []) 内。您需要告诉 R 将上一行的结果传递到哪里,可以使用 .

但它不适用于 sum(b2m)/length(b2m),原因不同:有两个函数,因此您需要将其转换为一个函数(这可以通过将此行放在 {} 之间来完成) . 或者你可以把操作分开两行.

你想要的结果可以是:

b2m <- b$bdi.2m-b$bdi.pre
b2m %>%
  as.vector(mode = "any") %>%
  .[!is.na(.)] %>%
  .^2 %>%
  {sum(.)/length(.)}

这是对@Wilson Souza 所写内容的补充,因为它更具可读性,尤其是当您必须使用大量具有复杂功能的管道时。

这里有一些方法。第一个使用 magrittr %$%,第二个使用 %>%,第三个使用 R 的基数 |>,第四个不使用管道,第五个使用 bizarro pipe只是巧妙地使用基本语法来模拟管道。

library(magrittr)

b %$% mean((bdi.2m - bdi.pre)^2, na.rm = TRUE)
## [1] 180.6666667

b %>% with(mean((bdi.2m - bdi.pre)^2, na.rm = TRUE))
## [1] 180.6666667

# remaining alternatives use only base R

b |> with(mean((bdi.2m - bdi.pre)^2, na.rm = TRUE))
## [1] 180.6666667

with(b, mean((bdi.2m - bdi.pre)^2, na.rm = TRUE))
## [1] 180.6666667

b ->.; with(., mean((bdi.2m - bdi.pre)^2, na.rm = TRUE))
## [1] 180.6666667