【发布时间】: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