R dplyr: соединение внутри трубы - PullRequest
0 голосов
/ 18 ноября 2018

Я совершенно новичок в dplyr и пытаюсь использовать dplyr для выполнения следующих действий:

У меня есть фрейм данных 'tdata' и я хочу заполнить пропущенные периоды (prd) с помощью 'NA' в каждой группе.Я хочу получить датафрейм «результаты».Для меня важна скорость, поэтому я надеюсь, что есть способ сделать это в dplyr быстрее, чем в цикле for.

> tdata <- data.frame(group = c(10, 10, 10, 11, 11), prd = c(1, 2, 5, 3, 5), value = c(2,7,3,6,2))
> tdata
  group prd value
1    10   1     2
2    10   2     7
3    10   5     3
4    11   3     6
5    11   5     2
> result <- data.frame(group = c(10, 10, 10, 10, 10, 11, 11, 11), prd = c(1, 2, 3, 4, 5, 3, 4, 5), value = c(2, 7, 'NA', 'NA', 3, 6, 'NA', 2))
> result
  group prd value
1    10   1     2
2    10   2     7
3    10   3    NA
4    10   4    NA
5    10   5     3
6    11   3     6
7    11   4    NA
8    11   5     2

Я попытался использовать каналы и получил эту ошибку:

> fdata <- tdata %>%
+   group_by(group) %>%
+   arrange(prd) %>%
+   left_join(data.frame(prd_v=min(prd):max(prd)), ., by=c("prd_v" = "prd"))
Error in data.frame(prd_v = min(prd):max(prd)) : object 'prd' not found

ОБНОВЛЕНИЕ: Кроме того, я хочу использовать этот канал внутри более крупной функции, поэтому я хотел бы иметь

period_variable <- "prd"

, а затем

tdata2 <- ndata %>%
  group_by(group) %>%
  complete(period_variable = full_seq(period_variable), period = 1) %>%
  ungroup()
tdata2

Но это не работает.Я пытался поиграть с get (), parse (), eval (), as.name (), as.symbol (), UQ (), !!, sym (), но все равно не работает.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Что касается второго вопроса, я не знаю, хотите ли вы этого, но я бы сделал что-то вроде этого:

prd = c(1, 2, 5, 3, 5)
period_variable <- quote(prd)

tdata2 <- tdata %>%
dplyr::group_by(group) %>%
tidyr::complete(prd= tidyr::full_seq(eval(period_variable), period = 1)) %>%
dplyr::ungroup()
0 голосов
/ 18 ноября 2018

Мы можем использовать функцию complete из пакета tidyr.

library(dplyr)
library(tidyr)

tdata2 <- tdata %>%
  group_by(group) %>%
  complete(prd = full_seq(prd, period = 1)) %>%
  ungroup()
tdata2
# # A tibble: 8 x 3
#   group   prd value
#   <dbl> <dbl> <dbl>
# 1    10     1     2
# 2    10     2     7
# 3    10     3    NA
# 4    10     4    NA
# 5    10     5     3
# 6    11     3     6
# 7    11     4    NA
# 8    11     5     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...