在两列中计算“反向”字符串匹配的出现次数

时间:2017-04-20 20:08:39

标签: r dataframe data.table

我现在正在处理R中的表格如下:

A B 09-2016
B A 09-2016
A C 10-2016
C A 11-2016
A B 12-2016

我试图计算前两列中相同行值的出现次数,例如,“A B”在表中出现两次,我使用以下R代码:

library(data.table)
dt = data.table(data)
dt[, list(Freq =.N, V3), by=list(V1,V2)]

我可以得到以下输出:

A B 2 09-2016
B A 1 09-2016
A C 1 10-2016
C A 1 11-2016
A B 2 12-2016

现在我想将反向模式的出现,例如“A B”和“B A”计算为相同的值并得到以下输出:

A B 3 09-2016
B A 3 09-2016
A C 2 10-2016
C A 2 11-2016
A B 3 12-2016

我的问题是:如何更改上述代码来处理此案例?或者还有另一种方式吗? THX。

3 个答案:

答案 0 :(得分:3)

library(data.table)
dt <- data.table(V1 = c("A", "B", "A", "C", "A"),
    V2 = c("B", "A", "C", "A", "B"),
    V3 = c("09-2016", "09-2016", "10-2016", "11-2016", "12-2016"))
dt[, tempvar := paste0(sort(c(V1,V2)), collapse = ""), by = 1:nrow(dt)]    
dt[, freq := .N, by = tempvar][, tempvar:=NULL]

答案 1 :(得分:1)

以下尝试使用pminpmax粘贴已排序的两列。

library(data.table)

dt[, freq := .N, by = .(new = paste(pmin(V1, V2), pmax(V1, V2)))][]

#   V1 V2 V3      V4 freq
#1:  A  B  2 09-2016    3
#2:  B  A  1 09-2016    3
#3:  A  C  1 10-2016    2
#4:  C  A  1 11-2016    2
#5:  A  B  2 12-2016    3

答案 2 :(得分:1)

您最初可以选择2列V1,V2中的maxmin以及group by这些值,以便对称对频率进行求和。

dt<-dt[,.(mx=max(as.character(V1),as.character(V2)),mn=min(as.character(V1),as.character(V2)))
       ,by=.(V1,V2,V3)]
dt<-dt[,.(Freq =.N,V1,V2,V3), by=.(mx,mn)][,.(V1,V2,V3,Freq)]
dt

R-Fiddle