定位 dplyr 管道中的特定列

tc_*_*ata 3 r dplyr tidyverse

我非常喜欢在 R 中使用 magrittr 管道 %>%,并尝试尽可能频繁/高效地使用它们。我经常需要定位管道链中的特定列,例如更改列类型。这导致我必须打破链条/我的工作流程,因为我只需要定位特定列而不是整个数据框。

考虑以下示例:

library(tidyverse)
rm(list = ls())

a <- c(1:20)
b <- rep(c("a", "b"), 10)

df <- data_frame(a, b) %>% 
  rename(info = b) %>% 
  recode(x = df$info, "a" = "x")  #I'd like to target only the df$info column here
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为 dplyr 不希望我更改管道链中函数的 x = 参数。

library(tidyverse)
rm(list = ls())

a <- c(1:20)
b <- rep(c("a", "b"), 10)

df <- data_frame(a, b) %>% 
  rename(info = b)

df$info <- df$info %>%   #this works as expected, but is not as elegant
  recode("a" = "x")
Run Code Online (Sandbox Code Playgroud)

这就是我认为应该这样做的方式,但我觉得它并不像我希望的那样高效/优雅,特别是如果我计划在重新编码后将更多函数链接在一起。

有没有一种方便的方法来解决这个问题,以便我可以告诉管道链中的命令仅针对特定列?

akr*_*run 6

我们需要把它放在里面mutate

data_frame(a, b) %>% 
    rename(info = b) %>% 
    mutate(info = recode(info,  a = "x"))
# A tibble: 20 x 2
#       a info 
#   <int> <chr>
# 1     1 x    
# 2     2 b    
# 3     3 x    
# 4     4 b    
# 5     5 x    
# 6     6 b    
# 7     7 x    
# 8     8 b    
# 9     9 x    
#10    10 b    
#11    11 x    
#12    12 b    
#13    13 x    
#14    14 b    
#15    15 x    
#16    16 b    
#17    17 x    
#18    18 b    
#19    19 x    
#20    20 b    
Run Code Online (Sandbox Code Playgroud)