合并列和计数组合(对)

时间:2019-07-17 19:39:18

标签: r data.table

我尝试计算通过组合列创建的对的出现,而对中元素的顺序并不重要。

例如: -具有两列名称(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

预期结果:

  • 例如C_A和A_C应该被视为同一对,等等。
#     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执行此操作的任何建议

1 个答案:

答案 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
>