临时将变量存储在管道系列中 dplyr

hmh*_*sen 3 r dplyr

有没有办法暂停一系列管道来存储一个临时变量,以后可以在管道序列中使用?

我发现了这个问题,但我不确定它是否在做我正在寻找的同样的事情。

这是一个示例数据框:

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))
Run Code Online (Sandbox Code Playgroud)

我将转换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
Run Code Online (Sandbox Code Playgroud)

在我的现实世界问题中,我有很长的管道链,如果我可以在管道结构中执行此操作会容易得多。我想做一些看起来像这样的事情:

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

我可以做类似以下的事情,但它似乎真的很草率。

df %>% 
  mutate(n = nrow(.)) %>% 
  gather(var, value, -Grp, -n) %>% 
  mutate(newval = value * mean(n))
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,或者是一个很好的解决方法?

MrF*_*ick 6

您可以将代码块用于局部变量。这看起来像

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

请注意我们如何在这里也传递.togather并且管道在块内继续。但是你可以在之后放其他部分

df %>% 
{ n = nrow(.)
  gather(., var, value, -Grp) %>% 
  mutate(newval = value * n)
} %>% 
select(newval)
Run Code Online (Sandbox Code Playgroud)