Временно хранить переменные в серии труб dplyr - PullRequest
1 голос
/ 09 мая 2019

Есть ли способ приостановить серию каналов для сохранения временной переменной, которая может быть использована позже в последовательности каналов?

Я нашел этот вопрос , но я не уверенчто он делал то же самое, что я искал.

Вот примерный кадр данных:

library(dplyr)
set.seed(123)
df <- tibble(Grp = c("Apple","Boy","Cat","Dog","Edgar","Apple","Boy","Cat","Dog","Edgar"),
             a = sample(0:9, 10, replace = T),
             b = sample(0:9, 10, replace = T),
             c = sample(0:9, 10, replace = T),
             d = sample(0:9, 10, replace = T),
             e = sample(0:9, 10, replace = T),
             f = sample(0:9, 10, replace = T),
             g = sample(0:9, 10, replace = T))

Я собираюсь преобразовать df в длинный формат, но, сделав это,Мне нужно будет применить количество строк до gather.

. Вот как будет выглядеть мой желаемый результат.В этом случае сохранение количества строк до начала канала будет выглядеть следующим образом:

n <- nrow(df)

df %>% 
  gather(var, value, -Grp) %>% 
  mutate(newval = value * n)
# A tibble: 70 x 4
   Grp   var   value newval
   <chr> <chr> <int>  <int>
 1 Apple a         2     20
 2 Boy   a         7     70
 3 Cat   a         4     40
 4 Dog   a         8     80
 5 Edgar a         9     90
 6 Apple a         0      0
 7 Boy   a         5     50
 8 Cat   a         8     80
 9 Dog   a         5     50
10 Edgar a         4     40
# ... with 60 more rows

В моей реальной проблеме у меня длинная цепочка каналов, и было бы намного проще, если бы я мог выполнитьэто действие в структуре трубы.Я хотел бы сделать что-то похожее на это:

df %>% 
  { "n = nrow(.)" } %>% # temporary variable is created here but df is passed on
  gather(var, value, -Grp) %>% 
  mutate(newval = value * n)

Я мог бы сделать что-то вроде следующего, но это кажется очень неаккуратным.

df %>% 
  mutate(n = nrow(.)) %>% 
  gather(var, value, -Grp, -n) %>% 
  mutate(newval = value * mean(n))

Есть ли способ сделать этоили, может быть, хороший обходной путь?

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Вы можете использовать блок кода для локальной переменной.Это выглядело бы как

df %>% 
{ n = nrow(.)
  gather(., var, value, -Grp) %>% 
  mutate(newval = value * n)
}

Обратите внимание, что здесь мы также должны передать . в gather, и труба продолжается внутри блока.Но вы могли бы поставить другие части потом

df %>% 
{ n = nrow(.)
  gather(., var, value, -Grp) %>% 
  mutate(newval = value * n)
} %>% 
select(newval)
1 голос
/ 10 мая 2019

Вот вариант с %>>% (оператор трубопровода) от pipeR

library(pipeR)
library(dplyr)
library(tidyr)
df %>>% 
   (~ n  = nrow(.)) %>% 
    gather(., var, value, -Grp) %>%
    mutate(newval = value * n)
# A tibble: 70 x 4
#   Grp   var   value newval
#   <chr> <chr> <int>  <int>
# 1 Apple a         2     20
# 2 Boy   a         7     70
# 3 Cat   a         4     40
# 4 Dog   a         8     80
# 5 Edgar a         9     90
# 6 Apple a         0      0
# 7 Boy   a         5     50
# 8 Cat   a         8     80
# 9 Dog   a         5     50
#10 Edgar a         4     40
# … with 60 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...