R 中使用的管道运算符

cha*_*les 2 r

由于我刚刚开始学习R,我想将下面的代码重新编写成管道运算符的方式。但是,设置 rowname 和 colname 阻止了我。如果有人能帮助我,我将不胜感激,非常感谢!

原代码详细如下,

data_3 <- c(692, 5, 0, 629, 44, 9)
table_3 <- matrix(data_3, ncol=3, byrow = TRUE)
colnames(table_3) <- c("Improved", "Hospitalized", "Death")
rownames(table_3) <- c("Treated", "Placebo")
table_3 <- as.table(table_3)

chisq.test(table_3)
fisher.test(table_3)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用管道运算符时,我在设置 colname 和 rowname 时遇到了麻烦。

c(692, 5, 0, 629, 44, 9) %>% 
  matrix(ncol = 3) %>% 
  colnames <- c("Improved", "Hospitalized", "Death")
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我使用这个管道操作员,我将不胜感激。

非常感谢您的支持!

此致,

查尔斯

Ben*_*ker 6

我建议:

c(692, 5, 0, 629, 44, 9) |>
  matrix(ncol = 3) |> 
  as.data.frame() |>
  setNames(c("Improved", "Hospitalized", "Death"))
Run Code Online (Sandbox Code Playgroud)

注释/未经请求的建议

  • 我使用了本机 R 管道 ( |>),因此我不必加载magrittr(或dplyrtidyverse)。(原生管道不太一样%>%但它们的工作原理非常相似。)
  • 我将矩阵转换为数据框;数据框有一个“名称”(与其列名称相同)属性,其中矩阵只有“列名称”;setNames()允许您使用“常规”函数(而不是奇怪的替换函数,即colnames<-)。如果您打算经常这样做,但确实不想将矩阵转换为数据框,您可以定义
set_col_names <- function(x, nm) {
   colnames(x) <- nm
   return(x)
}
Run Code Online (Sandbox Code Playgroud)

(这会稍微降低效率但更容易阅读)

  • 我个人的观点是这个例子过度使用了管道。管道很棒,但在某种程度上,它们使代码(对我来说)变得更加晦涩而不是更清晰(但这个例子并不像……那么糟糕3 %>% `+`(5)
  • 在现实生活中我可能会把这段代码写成
matrix_3 <- matrix(c(692, 5, 0, 629, 44, 9),
                 ncol=3, byrow = TRUE,
                 dimnames = list(c("Treated", "Placebo"),
                                 c("Improved", "Hospitalized", "Death")))
table_3 <- as.table(matrix_3)
Run Code Online (Sandbox Code Playgroud)

(最后一步我可能会使用管道。)