使用用户定义的函数在Expss表中动态传递参数

麦克森·杜姆(Maxence Dum)。

我有一个与expss表相关的(新)问题。我编写了一个非常简单的UDF(依赖于几个expss函数),如下所示:

library(expss)
z_indices <- function(x, m_global, std_global, weight=NULL){
  if(is.null(weight)) weight = rep(1, length(x))
  z <- (w_mean(x, weight)-m_global)/std_global
  indices <- 100+(z*100)
  return(indices)
}

基于infert数据集的可重现示例(加上任意权重的向量):

data(infert)
infert$w <- as.vector(x=rep(2, times=nrow(infert)), mode='numeric')
infert %>%
  tab_cells(age, parity) %>%
  tab_cols(total(), education, case %nest% list(total(), education)) %>%
  tab_weight(w) %>%
  tab_stat_valid_n(label="N") %>%
  tab_stat_mean(label="Mean") %>%
  tab_stat_fun(label="Z", function(x, m_global, std_global, weight=NULL){
    z_indices(x, m_global=w_mean(infert$age, infert$w),std_global=w_sd(infert$age, infert$w))
    }) %>%
  tab_pivot(stat_position="inside_columns")

该表已计算出来,第一行的输出(几乎)是预期的。然后,第二行的内容变得混乱,因为两个参数都z_indices明确地指向infert$ageinfert$parity期望在哪里我的问题:有没有一种方法可以动态传递tab_cellsas函数参数tab_stat_fun中的变量以匹配要处理的变量?我猜这发生在函数声明中,但不知道如何进行...

谢谢!

编辑2020年4月28日: @Gregory Demin的回答在推断数据集的范围内效果很好,尽管为了更好地扩展到更大的数据框,我编写了以下循环:

var_df <- data.frame("age"=infert$age, "parity"=infert$parity)
tabZ=infert
for(each in names(var_df)){
  tabZ = tabZ %>%
    tab_cells(var_df[each]) %>%
    tab_cols(total(), education) %>%
    tab_weight(w) %>%
    tab_stat_valid_n(label="N") %>%
    tab_stat_mean(label="Mean") %>%
    tab_stat_fun(label="Z", function(x, m_global, std_global, weight=NULL){
      z_indices(x, m_global=w_mean(var_df[each], infert$w),std_global=w_sd(var_df[each], infert$w))
    })
} 
tabZ = tabZ %>% tab_pivot()

希望这会在将来激发其他expss用户!

格雷戈里·德明

对于这种情况,没有通用的解决方案。中的函数tab_stat_fun始终在单元格内部进行计算,因此您无法在其中获取全局值。但是,在您的情况下,我们可以在汇总之前计算z-index。不是那么灵活的解决方案,但它可以工作:

# function for weighted z-score
w_z_index = function(x, weight = NULL){
    if(is.null(weight)) weight = rep(1, length(x))
    z <- (x - w_mean(x, weight))/w_sd(x, weight)
    indices <- 100+(z*100)
    return(indices)
}

data(infert)
infert$w <- rep(2, times=nrow(infert))
infert %>%
    tab_cells(age, parity) %>%
    tab_cols(total(), education, case %nest% list(total(), education)) %>%
    tab_weight(w) %>%
    tab_stat_valid_n(label="N") %>%
    tab_stat_mean(label="Mean") %>%
    # here we get z-index instead of original variables
    tab_cells(age = w_z_index(age, w), parity = w_z_index(parity, w)) %>%
    tab_stat_mean(label="Z") %>%
    tab_pivot(stat_position="inside_columns")

更新。更具扩展性的方法:

w_z_index = function(x, weight = NULL){
    if(is.null(weight)) weight = rep(1, length(x))
    z <- (x - w_mean(x, weight))/w_sd(x, weight)
    indices <- 100+(z*100)
    return(indices)
}

w_z_index_df = function(df, weight = NULL){
    df[] = lapply(df, w_z_index, weight = weight)
    df
}

data(infert)
infert$w <- rep(2, times=nrow(infert))
infert %>%
    tab_cells(age, parity) %>%
    tab_cols(total(), education, case %nest% list(total(), education)) %>%
    tab_weight(w) %>%
    tab_stat_valid_n(label="N") %>%
    tab_stat_mean(label="Mean") %>%
    # here we get z-index instead of original variables
    # we process a lot of variables at once
    tab_cells(w_z_index_df(data.frame(age, parity))) %>%
    tab_stat_mean(label="Z") %>%
    tab_pivot(stat_position="inside_columns")

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在SQL中使用用户定义的函数返回基于2个参数的表

来自分类Dev

使用expss :: cro()编写用户定义的函数

来自分类Dev

C#在SQL Server中调用用户定义的标量函数,该函数将表类型作为其参数

来自分类Dev

R:使用用户输入将函数和参数作为参数传递给高阶函数

来自分类Dev

R:使用用户输入将函数和参数作为参数传递给高阶函数

来自分类Dev

使用用户定义函数中的值创建组合框

来自分类Dev

如何使用插入更新另一个表中的列,并使用用户定义的函数交叉应用

来自分类Dev

如何使用用户定义的相等函数在Javascript中创建一组用户定义的对象?

来自分类Dev

在 R 中的用户定义函数中传递多个参数?

来自分类常见问题

应用用户定义的函数,在多个列中存在值的地方传递kwarg

来自分类Dev

应用用户定义的函数,在多个列中存在值的地方传递kwarg

来自分类Dev

SELECT结果作为用户定义的表参数函数中的参数

来自分类Dev

有没有一种方法可以在不使用用户定义函数的情况下在SQL中动态执行查询?

来自分类Dev

是否可以在sql中的另一个用户定义的表类型中使用用户定义的表类型

来自分类Dev

使用csv文件中的数据使用用户定义的表类型测试存储过程

来自分类Dev

使用用户注册表动态生成子域

来自分类Dev

使用用户定义的函数对VBA数组中的唯一值进行计数

来自分类Dev

使用用户定义的参数调用存储过程

来自分类Dev

使用用户定义的参数调用存储过程

来自分类Dev

在Python中使用用户输入填充函数参数

来自分类Dev

从WPF C#中的For循环调用用户定义的函数

来自分类Dev

在Sqlite的Insert命令中调用用户定义的函数

来自分类Dev

如何在C ++中调用用户定义的函数?

来自分类Dev

使用Rcpp从C ++调用用户定义的R函数

来自分类Dev

原则:在ORDERBY中使用用户定义的函数

来自分类Dev

如何在python中使用用户定义的函数?

来自分类Dev

如何创建使用用户定义函数的BigQuery视图?

来自分类Dev

使用用户定义的函数进行字符串反向

来自分类Dev

使用用户定义的函数作为布尔表达式

Related 相关文章

  1. 1

    在SQL中使用用户定义的函数返回基于2个参数的表

  2. 2

    使用expss :: cro()编写用户定义的函数

  3. 3

    C#在SQL Server中调用用户定义的标量函数,该函数将表类型作为其参数

  4. 4

    R:使用用户输入将函数和参数作为参数传递给高阶函数

  5. 5

    R:使用用户输入将函数和参数作为参数传递给高阶函数

  6. 6

    使用用户定义函数中的值创建组合框

  7. 7

    如何使用插入更新另一个表中的列,并使用用户定义的函数交叉应用

  8. 8

    如何使用用户定义的相等函数在Javascript中创建一组用户定义的对象?

  9. 9

    在 R 中的用户定义函数中传递多个参数?

  10. 10

    应用用户定义的函数,在多个列中存在值的地方传递kwarg

  11. 11

    应用用户定义的函数,在多个列中存在值的地方传递kwarg

  12. 12

    SELECT结果作为用户定义的表参数函数中的参数

  13. 13

    有没有一种方法可以在不使用用户定义函数的情况下在SQL中动态执行查询?

  14. 14

    是否可以在sql中的另一个用户定义的表类型中使用用户定义的表类型

  15. 15

    使用csv文件中的数据使用用户定义的表类型测试存储过程

  16. 16

    使用用户注册表动态生成子域

  17. 17

    使用用户定义的函数对VBA数组中的唯一值进行计数

  18. 18

    使用用户定义的参数调用存储过程

  19. 19

    使用用户定义的参数调用存储过程

  20. 20

    在Python中使用用户输入填充函数参数

  21. 21

    从WPF C#中的For循环调用用户定义的函数

  22. 22

    在Sqlite的Insert命令中调用用户定义的函数

  23. 23

    如何在C ++中调用用户定义的函数?

  24. 24

    使用Rcpp从C ++调用用户定义的R函数

  25. 25

    原则:在ORDERBY中使用用户定义的函数

  26. 26

    如何在python中使用用户定义的函数?

  27. 27

    如何创建使用用户定义函数的BigQuery视图?

  28. 28

    使用用户定义的函数进行字符串反向

  29. 29

    使用用户定义的函数作为布尔表达式

热门标签

归档