2017-03-17 6 views
1

data.tableでユーザー定義関数を渡す方法を知りたいと思います。data.tableでユーザー定義関数を使用する

data.tableを使用して、2つのグループによるすべての有効な応答( '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") 

しかし、これが唯一の一番上の行が返されます。私は、スタックオーバーフロー上の他の項目を読んで(例えばUsing data.table i and j arguments in functions)や他のコードを試してみた

grp1 grp2  V1 
1: I A 55.55556 

が、私は見つけることができませんでしたそれを働かせる方法。

私はRが新しく、フィードバックをいただければ幸いです。

答えて

1

この問題は、by引数を指定する方法にあります。また、我々はワンステップでソートを行うために、byの代わりにkeybyを使用することができます。

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は、あなたをとても感謝あなたの知識を共有するための!それは完璧に動作します! FrankとMichaelChiricoもあなたの貢献にとても感謝しています!私は熱心に勉強します:) – tmr

+0

最後に ')'前 '' 'は必要ないと思いますか?私はそれを編集しようとしていたが、それは6文字未満だったので、私はchsngeを提案できなかった。 – tmr

関連する問題