【问题标题】:Using group_by in function在函数中使用 group_by
【发布时间】:2021-10-20 22:17:56
【问题描述】:

我编写了一个函数来使用折刀标准误差计算两个向量之间平均值比率的置信区间


jackknife_CI = function(x, y, alpha = .05) {

 xl = (sum(x,na.rm=T) - x) / (length(x) - 1)
 yl = (sum(y,na.rm=T) - y) / (length(y) - 1)
 n = length(x) + length(y)
 
 jack_se = (sd(c(xl / mean(y,na.rm=T), mean(x,na.rm=T) / yl),na.rm=T) * (n - 1)) / sqrt(n)

 mean(x, na.rm = T) / mean(y, na.rm = T) + jack_se * qnorm(c(alpha/2,1-alpha/2))
}

然后我想通过以下方式将它与 ToothGrowth 数据集一起使用:


df1 =
  ToothGrowth %>%
  filter(supp == "OJ") %>% 
  rename(len_x = len) %>% 
  select(dose,len_x)

df2 =
  ToothGrowth %>%
  filter(supp == "VC") %>% 
  rename(len_y = len) %>% 
  select(dose, len_y)

df = cbind(df1,df2)
df = df[,-3]
jack_CI = df %>% group_by(dose) %>% jackknife_CI(x = len_x, y = len_y)

我的问题是最后一行导致错误:

Error in jackknife_CI(., x = len_x, y = len_y) : object 'len_x' not found

我该如何解决这个问题?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    最后一行需要是:

    jack_CI = jackknife_CI(x = df$len_x, y = df$len_y)

    你运行它的方式被解释如下:

    jack_CI = jackknife_CI(group_by(df, dose), x = len_x, y = len_y)

    这导致了几个问题:

    • jackknife_CI 不希望第一个参数是数据框。 (因为管道操作员)
    • len_xlen_y 在数据框之外无法识别。

    如果您想在每个组上运行该功能,您可以这样做:

    df %>% group_by(dose) %>% 
      do({
        ci <- jackknife_CI(.$len_x, .$len_y)
        tibble(low = ci[1], hi = ci[2])
      })
    

    我使用do,因为该函数返回两个值。否则你可以只使用summarize。每个组都被传递给do,然后返回一个小标题(注意do 中的最后一行),然后将其堆叠以返回结果。我指的是do 中的每个组,.$variable_name 中的点引用了正在传递的值(在这种情况下是每个组的数据框)

    【讨论】:

    • 我明白了。你有什么建议如何输入一个分组的数据框,同时保持输入只有两个向量 x,y?
    • 请检查编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2018-11-02
    • 2017-12-14
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    相关资源
    最近更新 更多