R-使用一个自定义功能,可以期待具有突变和group_by的向量



我想运行一个自定义函数,该函数使用按组拆分的dataframe的特定列。这是我的示例数据&功能代码:

 my_data = data.frame(N = c(12, 12, 24, 24, 12, 12),
                     p = rep(c(.125,.125,.025),2),
                     group = rep(c("dogs","cats"),each=3))
power.sequential <- function(d, nseq, pseq){
  decvec <- NULL
  nvec <- NULL
  for (i in 1:100){
    decvec[i] <- 0
    nvec[i] <- 0
    j <- 1
    x <- NULL
    while(decvec[i] == 0 & nvec[i] < sum(nseq)){
      x <- c(x, rnorm(nseq[j], mean = d))
      p <- t.test(x)$p.value
      nvec[i] <- nvec[i] + nseq[j]
      if (p < pseq[j]) decvec[i] <- 1
      j <- j + 1      
    }
  }
  power <- mean(decvec == 1)
  meanN <- mean(nvec)
  return(list("power" = power, "mean_N" = meanN))
}

现在,我想在数据框架中的每个组上运行此功能。这就是正常称为函数的方式:

power.sequential(d = .5,
                 nseq = c(12,12,24),
                 pseq = c(.125,.125,.025))

该函数返回两个值,理想情况下,它们将分别保存在我的数据框架的单独列中。这是我最好的尝试,但它给出了一个错误消息:

my_data %>% group_by(group) %>%
  mutate(result = power.sequential(d=.5,nseq=N,pseq=p))

我可能需要重塑我的数据框架,以使每个组都是一行,但是我一直坚持如何进行。

这是我所需的输出,功能输出两个值(power and Meann(,每个值都应获得自己的列。

group power meanN
 dogs  .94   20.28
 cats  .95   27.36

您可以做:

my_data %>%
 group_by(group) %>%
 do(data.frame(power.sequential(d=.5,nseq=.$N,pseq=.$p)[c(1, 2)])) %>%
 data.frame()

给出:

  group power mean_N
1  cats  0.96  27.24
2  dogs  0.94  21.12

可以使用data.table简化任务。一个人可以直接调用'j`截面中的函数,两个值将显示为单独的列。

library(data.table)
setDT(my_data)
set.seed(1)
my_data[,power.sequential(0.5, N, p), by=group]
# group power mean_N
# 1:  dogs  0.90  24.48
# 2:  cats  0.94  27.72

NOTE set.seed(1)已被用来保持结果一致。

最新更新