如何使用 dplyr/magrittr 管道将字符串转换为因子并设置对比度

Fed*_*mmi 4 r dplyr magrittr

我有一个相当具体的问题:如何将字符串变成一个因子并在管道内设置其对比?

假设我有一个像下面这样的 tibble

tib <- data_frame (a = rep(c("a","b","c"),3, each = T), val = rnorm(9))
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用两个单独的行

tib$a <- factor(tib$a)
contrasts(tib$a) <- contr.sum(3)
Run Code Online (Sandbox Code Playgroud)

但是如果我想在来自 dplyr 的管道中执行相同的操作呢?

Hon*_*Ooi 5

R中的一切都是一个函数。你只需要知道它叫什么。在这种情况下,它是contrasts<-为一个因素分配对比。

mutate(tib, a=`contrasts<-`(factor(a), , contr.sum(3)))
Run Code Online (Sandbox Code Playgroud)


Flo*_*ian 4

好吧,这是一个有趣的谜题,因为我以前从未使用过 do(),但这对我有用:

tib <- data.frame (a = rep(c("a","b","c"),3, each = T), val = rnorm(9)) 

tib = tib %>% mutate(a = factor(a)) %>% do({function(X) {contrasts(X$a) <- contr.sum(3); return(X)}}(.))

contrasts(tib$a)
Run Code Online (Sandbox Code Playgroud)

结果:

  [,1] [,2]
a    1    0
b    0    1
c   -1   -1
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

编辑:评论请求解释,见下文:

这对我来说也是新的。据我了解,在 do() 调用中,它说

{func}(.)
Run Code Online (Sandbox Code Playgroud)

这意味着应该使用参数 . 来调用函数,该参数是 do 调用中的数据帧。在 func 中,我们将函数指定为

function(X) {operation to perform on X}
Run Code Online (Sandbox Code Playgroud)

所以把它加在一起:

{function(X) {operation to perform on X}}(.)
Run Code Online (Sandbox Code Playgroud)

意思是 。用作函数 X 中的参数,因此它基本上变成“要执行的操作”。