2016-07-26 16 views
1

グループごとにデータセット内の競合の数をカウントしたいと思います。私はdata.tableでこれを行う簡単な方法が必要だと思うが、それを理解しているようには見えない。R個のデータテーブル内の条件付きユニークなカウント

testDT <- data.table(Name = c(rep('A',6),rep('B',5)), 
        Division = c(rep(11,6),rep(12,5)), 
        ID = c(205,205,NA,201,201,201,203,203,203,204,NA), 
        Conflict = c(0,0,0,1,1,1,1,1,1,1,0)) 

は、私は1の競合フラグを持つ非NA IDの一意の番号をカウントする必要があります。data.tableの各行のための競合がある場合、私は私を伝えるためにダミー変数を作成しました新しい列にその数を各Name-Divisionグループに適用します。これは、答えはどうあるべきかです:

testDT[, Count := c(rep(1,6),rep(2,5))] 

    Name Division ID Conflict Count 
1: A  11 205  0  1 
2: A  11 205  0  1 
3: A  11 NA  0  1 
4: A  11 201  1  1 
5: A  11 201  1  1 
6: A  11 201  1  1 
7: B  12 203  1  2 
8: B  12 203  1  2 
9: B  12 203  1  2 
10: B  12 204  1  2 
11: B  12 NA  0  2 

私はsum(!is.na(unique(ID)))のいくつかの使用方法について考えてきたが、私は条件付きでデータのIセクションの基準を作成せずに一意の値をカウントするかどうかはわかりません。テーブル(Conflict == 1)

答えて

4

あなたはdata.table []内条件によってID変数のサブセットをして、一意の値数えることができます:

library(data.table) 
testDT[, Count := uniqueN(ID[!is.na(ID) & Conflict == 1]), by=.(Name, Division)] 
testDT 
#  Name Division ID Conflict Count 
# 1: A  11 205  0  1 
# 2: A  11 205  0  1 
# 3: A  11 NA  0  1 
# 4: A  11 201  1  1 
# 5: A  11 201  1  1 
# 6: A  11 201  1  1 
# 7: B  12 203  1  2 
# 8: B  12 203  1  2 
# 9: B  12 203  1  2 
# 10: B  12 204  1  2 
# 11: B  12 NA  0  2 

またはあなたのロジック以下:ここ

testDT[, Count := sum(!is.na(unique(ID[Conflict == 1]))), by=.(Name, Division)] 
+0

なぜ「j」内に条件がありますか?私はそれが遅いと想像します。 'testDT [!is.na(ID)&Conflict == 1、Count:= uniqueN(ID)、by =。(Name、Division)]'はテストを行うのではなく、テーブル全体に対してすべての論理テストを実行します。各グループ。私が何かを逃していない限り、 – MichaelChirico

+1

ああ私が参照してください。これにより、それらの行に「NA」が割り当てられます。それが重要なのならば、私は最大限に努力しています。 – MichaelChirico

+1

ああ、もう一つのこと。 'uniqueN'は' na.rm'引数を持っていますので、!is.naのコンディションの代わりにそれを使うことができます。あなたが使っているバージョンによっては、バグであなたを襲うかもしれません。 (私はhttps://github.com/Rdatatable/data.table/issues/1771を通過するために更新する必要がありました) – Frank

0

dplyrとオプションですが

library(dplyr) 
testDT %>% 
    group_by(Name, Division) %>% 
    mutate(Count = n_distinct(ID[!is.na(ID) & Conflict==1])) 
# Name Division ID Conflict Count 
# <chr> <dbl> <dbl> <dbl> <int> 
#1  A  11 205  0  1 
#2  A  11 205  0  1 
#3  A  11 NA  0  1 
#4  A  11 201  1  1 
#5  A  11 201  1  1 
#6  A  11 201  1  1 
#7  B  12 203  1  2 
#8  B  12 203  1  2 
#9  B  12 203  1  2 
#10  B  12 204  1  2 
#11  B  12 NA  0  2