我非常喜欢使用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")
我认为应该这样做,但我觉得它不像我希望的那样高效/优雅,特别是如果我计划在重新编码后将更多功能链接在一起。
有没有方便的方法,所以我可以告诉管道链中的命令只定位特定的列?
答案 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