获取data.table中一组变量的唯一出现次数列表

时间:2016-01-09 10:30:16

标签: r data.table

我想获得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是数据表中感兴趣的变量列表。

1 个答案:

答案 0 :(得分:2)

您不需要使用多个连接。您可以通过以下参考更新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'))

以不同的顺序排列列可以像在问题中一样进行:

android:largeHeap="true"