【问题标题】:Using a custom function expecting a vector with mutate and group_by使用一个自定义函数,该函数需要一个带有 mutate 和 group_by 的向量
【发布时间】:2018-03-29 23:13:01
【问题描述】:

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

 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 和 meanN),每个值都应该有自己的列。

group power meanN
 dogs  .94   20.28
 cats  .95   27.36

【问题讨论】:

  • 你能告诉我们你想要的输出吗?
  • 您的函数正在返回包含两种方法的列表。 mean 将接受向量答案,但始终返回标量结果。你真的想要两列的标量结果吗?
  • 是的,我希望输出中有两个单独的列。调整函数输出值的方式可能会更容易。
  • @Esther 我应该感谢随问题提供的代码/详细信息。它帮助我快速得到答案。

标签: r dplyr


【解决方案1】:

你可以这样做:

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

【讨论】:

  • power 和 mean_N 作为列表存储在数据框中,有没有办法在上面的代码中将它们转换为数字向量?否则我正在做的只是使用 as.numeric() 转换它们
【解决方案2】:

使用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

注意set.seed(1) 已用于保持结果一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2019-12-08
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多