2017-04-20 24 views
2

我現在正在處理中的R一表'反向'的字符串相匹配的發生如下:計數兩列

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

我曾試圖計算在同一行的值的出現次數前兩列,例如,「AB」,在表中出現了兩次,我用下列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 

現在我想算反向模式的出現,例如,「AB」和「BA」,因爲相同的值,得到下面的輸出:

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 

我的問題是:我如何改變上面的代碼來處理這種情況?還是有另一種方式?謝謝。

回答

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 
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] 
+0

我被引用由OP使用的相同的數據表。編輯過的答案明確包含了這一點。 – ahly

1

可以選擇2列V1,V2和最初那些group by值,以便對稱配對頻率總結的maxmin

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