R:在输出

时间:2017-08-04 18:41:56

标签: r

我有这个数据集:

X1         X2
123        ABC
123        ABC
123        ABD 
123        ABD
123        LNE
123        LNS

我正在使用此代码生成每个ID编号最频繁的一对列表:

 newdf = setDT(df)[, .N, .(X1, X2)][order(factor(X2, levels = 
          unique(X1)), -N),.(X1 =toString(unique(X2)[1:2])) , X1]

生成一个id号列表及其对应的顶对:

X1     X2
123    ABC,ABD

我的问题是成对中的3个字母代码经常切换位置,使元素彼此不一致。例如:

X1     X2
123    ABC, ABD
124    ABD, ABC 

如何确保配对保持一致,如下所示:

X1    X2
123   ABC, ABD
124   ABC, ABD

1 个答案:

答案 0 :(得分:1)

这可能有效:

mydf <- data.table(structure(list(X1 = c(123L, 123L, 123L, 123L, 123L, 123L, 124L, 124L, 124L), X2 = structure(c(1L,
1L, 2L, 2L, 3L, 4L, 1L, 2L, 2L), .Label = c("ABC", "ABD", "LNE", "LNS"), class = "factor")), .Names = c("X1",
 "X2"), class = "data.frame", row.names = c(NA, -9L)))
mydf[,X2:=factor(X2)]
mydf[,.N,by=.(X1,X2)][,.(X2=toString(sort(X2[order(N,decreasing = TRUE)][1:2]))),by=.(X1)]
# X1       X2
# 1: 123 ABC, ABD
# 2: 124 ABC, ABD

这是有效的,因为如果您在因子变量上调用sort,那么它将根据级别对其进行排序。