我现在正在处理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。
答案 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)
以下尝试使用pmin
和pmax
粘贴已排序的两列。
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中的max
和min
以及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