【问题标题】:Question about making R code more concise through piping关于通过管道使R代码更简洁的问题
【发布时间】:2020-01-07 14:55:52
【问题描述】:

我有几行代码希望使用管道更简洁,这样我就不必一遍又一遍地定义列名:

my_fields <- c(1,2,4) 
timeline_data_1 <- timeline_data[,my_fields]
timeline_data_1 <- timeline_data_1[order(timeline_data_1$avi_date),] #order the field
timeline_data_1$avi_date <- timeline_data_1 $avi_date/30 #divide the field by 30

当我尝试使用管道时,我最终会在这里遇到各种错误。如何使用管道使此语句更简洁?通常这是我尝试过的方法,但运气不佳:

my_fields <- c(1,2,4) 
timeline_data_1 <- timeline_data[,my_fields]  %>%
    timeline_data_1[order(timeline_data_1$avi_date),] #order the field
    timeline_data_1 $avi_date/30 #divide the field by 30

我收到一条错误消息:

undefined columns selected

【问题讨论】:

  • 问答没有列出运行提供的代码所需的库。

标签: r pipe


【解决方案1】:

更清洁的方式

您可以通过这样做获得相同的结果:

library(dplyr)
timeline_data_1 <- timeline_data %>%
  mutate(avi_date = avi_date/30) %>% #divide the field by 30
  arrange(desc(avi_date))) #order the field

希望这会有所帮助。

【讨论】:

  • 这转向主观性,但我总是更喜欢最后定义/命名管道的结果,因为它随着编码流程更自然地流动。所以一个替代方案可能是timeline_data %&gt;% do stuff %&gt;% {.} -&gt; timeline_data_1
【解决方案2】:

我个人不理解这种最近到处都依赖/使用tidyverse(我猜那是管道)语法的趋势。您正在用一些简单性换取额外的复杂性。例如,通过调用您需要了解其用法和语法的附加函数(例如mutatefilterarrange)。

我建议您坚持使用基本 R 并以有意义的方式简单地将命令组合在一起

timeline_data_1 <- timeline_data[order(timeline_data$avi_date),c(1,2,4)] 
timeline_data_1$avi_date <- timeline_data_1$avi_date/30 

【讨论】:

  • 是的。 dplyr 非常适合拆分、应用、组合东西,但我同意你的观点,对于简单的操作,外部依赖越少越好。此代码将在 5 年内有效。谁知道到那时dplyr代码会发生什么...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多