Вопрос о том, как сделать код R более сжатым с помощью трубопровода - PullRequest
0 голосов
/ 07 января 2020

У меня есть пара строк кода, которые я хотел бы сделать более краткими, используя конвейеры, чтобы мне не приходилось определять имя столбца снова и снова:

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

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Более чистый способ

Вы можете добиться того же результата, выполнив следующее:

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

Надеюсь, это поможет.

2 голосов
/ 07 января 2020

Я лично не понимаю эту недавнюю тенденцию полагаться / использовать синтаксис tidyverse (я полагаю, это ваш канал) везде. Вы торгуете некоторой простотой для дополнительной сложности. Например, вызывая дополнительные функции (например, mutate, filter, arrange), для которых вам необходимо знать использование и синтаксис.

Я бы посоветовал вам придерживаться базы 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 
...