prop.test和dplyr的客户功能错误

时间:2016-09-21 02:43:09

标签: r dplyr

以下代码运行良好:

library(dplyr)
library(lazyeval)
datatable <- data.frame(f= c("Group1","Group2")
           ,a = c(100,200)
           ,b = c(400,500)
           ,c = c(50000,35000)
           ,d = c(99000,70000))

datatable %>%
      group_by(f) %>%
      mutate(p = prop.test(x=c(a, b)
                           ,n=c(c, d)
                           ,alternative = c("two.sided")
                           ,correct = FALSE)$p.value)

但是,当放入函数时,代码错误:

functionx <- function(datatable, f, a, b, c, d)
  {
    Table <- datatable %>%
              group_by_(f) %>%
              mutate_(p = interp(~prop.test(x=c(a, b)
                                            ,n=c(c, d)
                                            ,alternative = c("two.sided")
                                            ,correct = FALSE)$p.value))
  }

我收到的错误如下:

  

错误:二元运算符的非数字参数

我尝试过几种不同的方式编写函数(例如a = as.name(a))。我是新编写的函数(特别是NSE / SE) - 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我能够找到解决问题的方法。建议阅读dplyr vignettes文档:https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html

functionx <- function(datatable, facet.var, treated.take, holdout.take, treated.pop, holdout.pop)
{
  datatable %>%
    group_by_(facet.var) %>%
    mutate_(p = interp(~prop.test(x=c(a, b)
                                  ,n=c(d, e)
                                  ,alternative = c("two.sided")
                                  ,correct = FALSE)$p.value
                            ,a = as.name(treated.take)
                            ,b = as.name(holdout.take)
                            ,d = as.name(treated.pop)
                            ,e = as.name(holdout.pop))

    )
}

datatablex <- data.frame(facet.varx= c("Group1","Group2")
           ,treated.takex = c(100,200)
           ,holdout.takex = c(400,500)
           ,treated.popx = c(50000,35000)
           ,holdout.popx = c(99000,70000))

functionx(datatablex, "facet.varx", "treated.takex", "holdout.takex", "treated.popx", "holdout.popx")

有两个问题:

  1. 该函数不喜欢我使用字母&#34; c&#34;来引用函数变量。不知道为什么,可能是因为它代表了一个载体?

  2. 添加&#34; a = as.name(processed.take)&#34;等。似乎纠正了很多问题。没有必要重命名processed.take = a,它可以写成processed.take = as.name(treated.take)。