我有一个简单的问题(貌似),但还没有找到适当的快速/时间&资源有效解决方案这是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,但它并没有解决我的目的。
非常感谢任何帮助。
谢谢!
答案 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