我有这个数据集:
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
答案 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
,那么它将根据级别对其进行排序。