2017-03-17 62 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

相關問題