如何将字符串转换为因子并使用 dplyr/magrittr 管道设置对比
how to transform a string into a factor and sets contrasts using dplyr/magrittr piping
我有一个相当具体的问题:如何将字符串变成一个因子并在管道中设置它的对比?
假设我有一个类似下面的问题
tib <- data_frame (a = rep(c("a","b","c"),3, each = T), val = rnorm(9))
现在,我可以使用两条单独的线
tib$a <- factor(tib$a)
contrasts(tib$a) <- contr.sum(3)
但是如果我想在来自 dplyr 的管道中执行相同的操作怎么办?
好的,这是一个有趣的谜题,因为我以前从未使用过 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)
结果:
[,1] [,2]
a 1 0
b 0 1
c -1 -1
希望对您有所帮助!
EDIT: Comment request for explanation, see below:
这对我来说也是新鲜事。据我了解,在 do() 调用中,它表示
{func}(.)
这意味着应该调用一个带有参数 . 的函数,它是 do 调用中的数据帧。在 func 中,我们将函数指定为
function(X) {operation to perform on X}
所以把这个加在一起:
{function(X) {operation to perform on X}}(.)
这意味着。在函数 X 中用作参数,因此它基本上变为 'operation to perform on .'
R 中的一切都是函数。你只需要知道它叫什么。在这种情况下,contrasts<-
将对比分配给一个因素。
mutate(tib, a=`contrasts<-`(factor(a), , contr.sum(3)))
我有一个相当具体的问题:如何将字符串变成一个因子并在管道中设置它的对比?
假设我有一个类似下面的问题
tib <- data_frame (a = rep(c("a","b","c"),3, each = T), val = rnorm(9))
现在,我可以使用两条单独的线
tib$a <- factor(tib$a)
contrasts(tib$a) <- contr.sum(3)
但是如果我想在来自 dplyr 的管道中执行相同的操作怎么办?
好的,这是一个有趣的谜题,因为我以前从未使用过 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)
结果:
[,1] [,2]
a 1 0
b 0 1
c -1 -1
希望对您有所帮助!
EDIT: Comment request for explanation, see below:
这对我来说也是新鲜事。据我了解,在 do() 调用中,它表示
{func}(.)
这意味着应该调用一个带有参数 . 的函数,它是 do 调用中的数据帧。在 func 中,我们将函数指定为
function(X) {operation to perform on X}
所以把这个加在一起:
{function(X) {operation to perform on X}}(.)
这意味着。在函数 X 中用作参数,因此它基本上变为 'operation to perform on .'
R 中的一切都是函数。你只需要知道它叫什么。在这种情况下,contrasts<-
将对比分配给一个因素。
mutate(tib, a=`contrasts<-`(factor(a), , contr.sum(3)))