定位dplyr管道中的特定列

时间:2018-03-22 11:41:18

标签: 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

这显然不起作用,因为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")

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

有没有方便的方法,所以我可以告诉管道链中的命令只定位特定的列?

1 个答案:

答案 0 :(得分:4)

我们需要将其放在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