2017-07-06 29 views
-1

比方說,我們有下列R- data.table(雖然dataframe原則是罰款以及):對於R data.table,如何使用uniqueN()來計算多列中的唯一/不同值?

library(data.table) 
new_dt = as.data.table(readcsv(...)) 
head(new_dt) 
    name order_no overlimit 
1 Amy  32 TRUE 
2 Jack  14 TRUE 
3 Jack  16 TRUE 
4 Dave  11 FALSE 
5 Amy  22 TRUE 
6 Jack  16 TRUE 
7 Tom  19 FALSE 
8 Larry  22 FALSE 
9 Tom  89 FALSE 
10 Dave  81 TRUE 
11 Jack  67 TRUE 
12 Tom  60 TRUE 
13 Amy  23 FALSE 
14 Jack  16 TRUE 

對於此任務的order_no值是無關緊要的---我想算的唯一編號行了nameoverlimit的:

name overlimit distinct_groups 
Amy  TRUE  2 
Amy  FALSE  1 
Jack TRUE  4 
Jack FALSE  0 
Dave TRUE  1 
Dave FALSE  1 
... 

是否一個簡單的包括在by參數的詳細列?

+1

如果您想編輯以改進它,我會說:讓它可以由其他人在新打開的R控制檯中通過複製粘貼來進行輸入;並確保顯示的所需輸出已完成並對應於輸入。無論如何,這個鏈接的問題是不是涵蓋了它? – Frank

+0

@Frank是的,我想刪除這個問題。謝謝 – ShanZhengYang

+0

嗯,我認爲你現在應該可以刪除它(使用底部的鏈接)。如果你認爲這會有所幫助,我可以放棄它。 – Frank

回答

1

要回答你的問題,是的,你可以兩個欄添加到by說法:

dt[, .(distinct_groups = uniqueN(order_no)), by = c("Name", "Overlimit")] 
0

如果該請求是具有在「超限」相鄰元件作爲一個單獨的基團,那麼我們可以用rleid創建組

dt[, .(overlimit = overlimit[1], distinct_group = uniqueN(order_no)), 
    .(name, grp = rleid(overlimit))][, grp := NULL][] 

如果它是一個簡單的分組和只希望組合

dt[, .(distinct_group = .N), by = .(name, overlimit) 
    ][CJ(name = dt$name, overlimit = dt$overlimit, unique = TRUE), 
     on = .(name, overlimit)][is.na(distinct_group), distinct_group := 0][] 
+0

OP的期望輸出在distinct_groups列中有零;你的嗎? – Frank

+0

@Frank我認爲他的輸入和輸出不正確 – akrun

+0

@Frank根據輸入示例,'Jack TRUE' count is only 3 – akrun

相關問題