我想知道如何在data.table中传递用户定义的函数。
我使用data.table创建了以下代码来计算响应百分比' b'两组之外的所有有效回复(' a'或' 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的新手,非常感谢您提供的任何反馈。
答案 0 :(得分:1)
问题在于您指定Content
参数的方式。我们也可以使用by
代替keyby
,一步完成排序:
by