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

R 获取data.table中一组变量的唯一出现次数列表,r,data.table,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

我想获得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

其中,
listX
是数据表中感兴趣的变量列表。

不需要使用多个联接。您可以通过更新
数据来获得相同的结果。表
可参考:

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'))

只要使用
DT[,uN1:=uniqueN(.SD),x1][,uN2:=uniqueN(.SD),(x1,x2)][,uN3:=uniqueN(.SD),(x1,x2,m1)]
就会得到同样的结果。@Jaap你的建议似乎正是我想要的。除了列顺序之外。但这是一个很容易解决的问题。@Jaap让我们继续尝试回答这个问题,不要让他们列在未回答列表中,如果你不打算,你可以建议Vivek用你的代码自我回答。@jangorecki现在将我的评论作为答案发布
setcolorder(DT, c('x1','uN1','x2','uN2','m1','uN3','m2'))