2017-07-06 26 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

相关问题