2016-01-09 4 views
2

Я хочу получить список уникальных счетчиков для набора переменных в таблице данных. Следующий код работает. Мне просто интересно, можно ли обобщить это с помощью функции. Тогда он может иметь более общую применимость для данных умеренного размера.получить список уникальных счетчиков для набора переменных в data.table

packageVersion('data.table') 
[1] ‘1.9.7’ 
library(data.table) 
DT <- data.table(x1=c("b","c", "a", "b", "a", "b",'b'), x2=as.character(c(1:6,1)),m1=c(seq(10,60,by=10),10),m2=1:7) 
DT 
> DT 
    x1 x2 m1 m2 
1: b 1 10 1 
2: c 2 20 2 
3: a 3 30 3 
4: b 4 40 4 
5: a 5 50 5 
6: b 6 60 6 
7: b 1 10 7 

###get unique counts of each occurrence of first variable x1 
setkey(DT,x1) 
u1<-DT[,.(uN1=uniqueN(.SD)),by=x1] 
U1<-u1[DT] 
U1 
> U1 
    x1 uN1 x2 m1 m2 
1: a 2 3 30 3 
2: a 2 5 50 5 
3: b 4 1 10 1 
4: b 4 4 40 4 
5: b 4 6 60 6 
6: b 4 1 10 7 
7: c 1 2 20 2 

###unique counts of (x1,x2) 
setkey(U1,x1,x2) 
u2<-U1[,.(uN2=uniqueN(.SD)),by=.(x1,x2)] 
U2<-u2[U1] 
U2 
> U2 
    x1 x2 uN2 uN1 m1 m2 
1: a 3 1 2 30 3 
2: a 5 1 2 50 5 
3: b 1 2 4 10 1 
4: b 1 2 4 10 7 
5: b 4 1 4 40 4 
6: b 6 1 4 60 6 
7: c 2 1 1 20 2 

###unique counts of (x1,x2,m1) 
setkey(U2,x1,x2,m1) 
u3<-U2[,.(uN3=uniqueN(.SD)),by=.(x1,x2,m1)] 
U3<-u3[U2] 
# desired order 
setcolorder(U3,c('x1','uN1','x2','uN2','m1','uN3','m2')) 
U3 
> U3 
    x1 uN1 x2 uN2 m1 uN3 m2 
1: a 2 3 1 30 1 3 
2: a 2 5 1 50 1 5 
3: b 4 1 2 10 2 1 
4: b 4 1 2 10 2 7 
5: b 4 4 1 40 1 4 
6: b 4 6 1 60 1 6 
7: c 1 2 1 20 1 2 

Предлагаемая функция может быть что-то вроде:

UniqueCombN(DT, listX) 

где listX является список переменных, представляющих интерес в таблице данных.

+2

Только с помощью 'DT [, Un1: = uniqueN (.sd), x1] [, Un2: = uniqueN (. SD),. (X1, x2)] [, uN3: = uniqueN (.SD),. (X1, x2, m1)] 'даст вам тот же результат. – Jaap

+0

@Jaap Ваше предложение похоже на то, что я искал. Помимо упорядочения столбцов. Но это то, что можно легко исправить. – Vivek

+0

@Jaap позволяет продолжать отвечать на вопрос, чтобы они не были перечислены в списке без ответа, если вы не поедете, вы можете предложить Vivek для самообслуживания с вашим кодом. – jangorecki

ответ

2

Несколько соединений, которые вы использовали, не нужны. Вы можете достичь того же результата, обновив data.table по ссылке с:

DT[, uN1:=uniqueN(.SD), x1 
    ][, uN2:=uniqueN(.SD), .(x1,x2) 
    ][, uN3:=uniqueN(.SD), .(x1,x2,m1)] 

дает:

> DT 
    x1 x2 m1 m2 uN1 uN2 uN3 
1: b 1 10 1 4 2 2 
2: c 2 20 2 1 1 1 
3: a 3 30 3 2 1 1 
4: b 4 40 4 4 1 1 
5: a 5 50 5 2 1 1 
6: b 6 60 6 4 1 1 
7: b 1 10 7 4 2 2 

Если вы хотите, чтобы установить порядок, вы можете использовать, например:

setorder(DT, x1, x2) 

, который дает:

> DT 
    x1 x2 m1 m2 uN1 uN2 uN3 
1: a 3 30 3 2 1 1 
2: a 5 50 5 2 1 1 
3: b 1 10 1 4 2 2 
4: b 1 10 7 4 2 2 
5: b 4 40 4 4 1 1 
6: b 6 60 6 4 1 1 
7: c 2 20 2 1 1 1 

Аранжировка столбцы в другом порядке, может быть сделано, как вы делали в ваш вопрос:

setcolorder(DT, c('x1','uN1','x2','uN2','m1','uN3','m2')) 
Смежные вопросы