2017-03-17 61 views
1

我想知道如何在data.table中传递用户定义的函数。获取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 

我堆栈溢出阅读其他物品(如Using data.table i and j arguments in functions),并尝试过其他代码,但我一直没能找到让它工作的方法。

我是R的新手,非常感谢您的反馈。

回答

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 
+1

'通过/ keyby = C(A组,B组)'读取清洁 – MichaelChirico

+0

@dww,非常感谢你分享你的知识!它工作完美!弗兰克和MichaelChirico非常感谢你的贡献!我会努力学习:) – tmr

+0

我认为']'之前的最后'''是不必要的?我试图编辑它,但它不到6个字符,所以我不能建议chsnge ... – tmr

相关问题