当前位置:  开发笔记 > 编程语言 > 正文

R:使用管道%>%和占位符进一步选择子集

如何解决《R:使用管道%>%和占位符进一步选择子集》经验,为你挑选了2个好方法。

我最近发现了管道操作符%>%,它可以使代码更具可读性.这是我的MWE.

library(dplyr)                                          # for the pipe operator
library(lsr)                                            # for the cohensD function

set.seed(4)                                             # make it reproducible
dat <- data.frame(                                      # create data frame
    subj = c(1:6),
    pre  = sample(1:6, replace = TRUE),
    post = sample(1:6, replace = TRUE)
)

dat %>% select(pre, post) %>% sapply(., mean)           # works as expected

但是,在这种特殊情况下,我很难使用管道操作符

dat %>% select(pre, post) %>% cohensD(.$pre, .$post)    # piping returns an error
cohensD(dat$pre, dat$post)                              # classical way works fine

为什么不能使用占位符.$?组合列?是否值得使用管道运算符编写此行%>%,还是使语法复杂化?这种经典的写作方式似乎更简洁.



1> asac - Reins..:

这可行:

dat %>% select(pre, post) %>% {cohensD(.$pre, .$post)}

将最后一个调用包装成花括号使得它被视为表达式而不是函数调用.当你将某些东西输入表达式时,.按预期更换.我经常使用这个技巧来调用一个与管道不能很好接口的功能.

大括号内部恰好是函数调用,但实际上可以是任何表达式..



2> Marijn Steve..:

由于您将一堆数据转换为一个(一行)值,因此您需要进行总结.在dplyr管道中,您可以使用汇总函数,在汇总函数中,您不需要子集,只需调用prepost

像这样:

dat %>% select(pre, post) %>% summarize(CD = cohensD(pre, post)) 

(在这种情况下,select语句实际上并不是必需的,但是我把它留下来以显示它在管道中是如何工作的)


我认为你不需要用`$`显式地子类型; 这应该足够了`dat%>%summary(CD = cohensD(pre,post))`
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有