我尝试计算通过组合列创建的对的出现,而对中元素的顺序并不重要。
例如: -具有两列名称(V1,V2)的数据表 -合并列以成对 -计算对数(忽略每个对的顺序):A_B = B_A
set.seed(126)
dt <- data.table(V1 = sample(LETTERS[1:4], 30, replace = T),
V2 = sample(LETTERS[1:4], 30, replace = T))
#Exclude rows with the same name
dt <- dt[V1 != V2]
#Create pairs by combining V1 and V2
dt[, pair := paste(V1, V2, sep="_")]
#Count the pairs
dt[, .N, by=.(pair)]
结果:
# pair N
# 1: C_A 1
# 2: B_C 6
# 3: C_B 3
# 4: C_D 1
# 5: A_B 2
# 6: D_C 4
# 7: A_C 2
# 8: B_A 2
# 9: B_D 1
# 10: A_D 1
# 11: D_B 2
预期结果:
# pair N
# 1: C_A 3 #A_C
# 2: B_C 9 #C_B
# 3: C_D 5 #D_C
# 4: A_B 4 #B_A
# 5: B_D 3 #D_B
# 6 : A_D 1
关于使用data.table
执行此操作的任何建议
答案 0 :(得分:1)
如果我们总是在pair :=
分配中首先在字母表中写最早的字母,该代码将产生所需的结果。我们将使用ifelse()
决定是否在V1
之前写V2
,如下所示。
library(data.table)
set.seed(126)
dt <- data.table(V1 = sample(LETTERS[1:4], 30, replace = T),
V2 = sample(LETTERS[1:4], 30, replace = T))
# adjusted version where first letter always < second letter
#Exclude rows with the same name
dt <- dt[V1 != V2]
#Create pairs by combining V1 and V2
dt[, pair := ifelse(V1 < V2,paste(V1, V2, sep="_"), paste(V2, V1, sep = "_"))]
#Count the pairs
dt[, .N, by=.(pair)]
...以及输出:
> #Count the pairs
> dt[, .N, by=.(pair)]
pair N
1: A_C 3
2: B_C 9
3: C_D 5
4: A_B 4
5: B_D 3
6: A_D 1
>