【问题标题】:Combining columns and count combinations (pairs) [duplicate]组合列和计数组合(对)[重复]
【发布时间】:2019-07-18 03:55:35
【问题描述】:

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

例如: - 具有两列名称的数据表(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执行此操作的任何建议

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    如果我们总是在 pair := 赋值中首先写字母表中最早的字母,代码将产生所需的结果。我们将使用ifelse() 来决定是否在V2 之前写V1,如下所示。

    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
    >
    

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多