R软件:根据第二列计算列中的出现组合

时间:2015-01-28 08:27:36

标签: r

我有一个简单的问题(貌似),但还没有找到适当的快速/时间&资源有效解决方案这是R-Software中的一个问题。 我的数据格式为:

INPUT
col1     col2
A         q
C         w
B         e
A         r
A         t
A         y
C         q
B         w
C         e
C         r
B         t
C         y

DESIRED OUTPUT
unit1     unit2     same_col2_freq
A          B          1
A          C          3
B          A          1
B          C          2
C          A          3
C          B          2 

输入 A 发生在col1中,其中 q,r,t,y 发生在col2中。现在, q,r,t,y 发生 B t ,因此A-B组合的计数为1。 B 发生在col1中,其中 e,w,t 发生在col2中。现在, e,w,t 发生 C w,t ,因此B-C组合的计数为2。 ....等等col1中的所有组合。

我使用for循环完成了它,但速度很慢。我从col1中选择唯一元素,然后,为col1的每个元素迭代所有数据。然后我使用rbind组合结果。这很慢且资源成本高。

我正在寻找一种有效的方法。也许存在我不知道的图书馆,功能等。我尝试使用共生矩阵,但col1中的元素数量约为10,000,但它并没有解决我的目的。

非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

使用merge将数据框与自身连接,然后使用aggregate在组内进行计数。演示:

d = data.frame(col1=c("A", "C", "B", "A", "A", "A", "C", "B", "C", "C", "B", "C"), col2=c("q", "w", "e", "r", "t", "y", "q", "w", "e", "r", "t", "y"))
dm = merge(d, d, by="col2")
dm = dm[dm[,'col1.x']!=dm[,'col1.y'],]
aggregate(col2 ~ col1.x + col1.y, data=dm, length)
#       col1.x col1.y col2
# 1      B      A    1
# 2      C      A    3
# 3      A      B    1
# 4      C      B    2
# 5      A      C    3
# 6      B      C    2

答案 1 :(得分:0)

这是一种类似的方法(如@cogitovita所示),但使用data.table。转换" data.frame"到" data.table"使用setDT,然后交叉加入(CJ)" col1"的唯一元素,按" col2"分组。子集不相等的输出列的行(V1!=V2),获取计数(.N),按新列(.(V1, V2)分组)并最终对列进行排序({{ 1}})

order(V1,V2)

数据

library(data.table)
setDT(df)[,CJ(unique(col1), unique(col1)), col2][V1!=V2, 
         .N, .(V1,V2)][order(V1,V2)]  
#   V1 V2 N
#1:  A  B 1
#2:  A  C 3
#3:  B  A 1
#4:  B  C 2
#5:  C  A 3
#6:  C  B 2