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