【问题标题】:Get a user-defined function work in data.table在 data.table 中获取用户定义的函数工作
【发布时间】:2017-03-17 17:12:47
【问题描述】:

我想知道如何在 data.table 中传递用户定义的函数。

我使用 data.table 创建了以下代码,以计算两组在所有有效响应(“a”或“b”)中响应“b”的百分比; grp1 和 grp2:

数据(带有警告信息):

library(data.table)
dt = data.table(rep(c("I", "II", "III", "IV")), rep(c("A", "B", "C")), 
                rep(c("a", "a", "b", "b", "b"), 20))
colnames(dt) = c("grp1", "grp2", "Q1")

计算受访者百分比的代码:

dt[, sum(Q1 %in% "b")/sum(!is.na(Q1))*100, by = grp1:grp2][order(grp1, grp2)]

这会产生我需要的东西(感谢@Frank 你在Calculate % respondents by more than one group for a survey data 的帮助):

    grp1 grp2       V1
 1:    I    A 55.55556
 2:    I    B 62.50000
 3:    I    C 62.50000
 4:   II    A 62.50000
 5:   II    B 55.55556
 6:   II    C 62.50000
 7:  III    A 50.00000
 8:  III    B 62.50000
 9:  III    C 66.66667
10:   IV    A 66.66667
11:   IV    B 62.50000
12:   IV    C 50.00000

我想做的是创建一个函数并使用它来计算 50 个其他项目的等效值集。我创建了以下函数,希望尽量减少重复过程;

test = function(question, groupA, groupB){
  dt[, sum(get(question) %in% "b")/sum(!is.na(get(question)))*100, by = eval((c(groupA, groupB)))][order(groupA, groupB)]
  }

test(question = "Q1", groupA = "grp1", groupB ="grp2")

但是,这只会返回第一行:

   grp1 grp2       V1
1:    I    A 55.55556

我已阅读 Stack Overflow 上的其他项目(例如 Using data.table i and j arguments in functions)并尝试了其他代码,但我无法找到使其工作的方法。

我是 R 新手,非常感谢您提供的任何反馈。

【问题讨论】:

    标签: r function data.table


    【解决方案1】:

    问题在于您指定 by 参数的方式。我们也可以用keyby代替by,一步完成排序:

    test = function(question, groupA, groupB){
      dt[, sum(get(question) %in% "b") / sum(!is.na(get(question))) * 100, 
        keyby =  c(groupA, groupB)] 
    }
    
    ans = test(question = "Q1", groupA = "grp1", groupB ="grp2")
    #   grp1  grp2       V1
    # 1:   I     A 55.55556
    # 2:   I     B 62.50000
    # 3:   I     C 62.50000
    # 4:  II     A 62.50000
    # 5:  II     B 55.55556
    # 6:  II     C 62.50000
    # 7: III     A 50.00000
    # 8: III     B 62.50000
    # 9: III     C 66.66667
    # 10:  IV     A 66.66667
    # 11:  IV     B 62.50000
    # 12:  IV     C 50.00000
    

    【讨论】:

    • @dww,非常感谢您分享您的知识!它完美无缺! Frank 和 MichaelChirico 也非常感谢您的贡献!我会努力学习的:)
    • 我认为 ' ] ' 之前的最后一个 ' ) ' 不是必需的吗?我试图编辑它,但它少于 6 个字符,所以我不能建议 chsnge...
    • @tmr 不错。我现在进行了编辑。在我采纳 MichaelChirico 的建议之前,那个额外的括号是早期版本的答案留下的错字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多