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が新しく、フィードバックをいただければ幸いです。
を '/ keyby = C(グループA、グループB)'クリーナー読み込んで – MichaelChirico
@dwwは、あなたをとても感謝あなたの知識を共有するための!それは完璧に動作します! FrankとMichaelChiricoもあなたの貢献にとても感謝しています!私は熱心に勉強します:) – tmr
最後に ')'前 '' 'は必要ないと思いますか?私はそれを編集しようとしていたが、それは6文字未満だったので、私はchsngeを提案できなかった。 – tmr