gpt4 book ai didi

R (data.table) : Fast counts of value matches in multiple column

转载 作者:行者123 更新时间:2023-12-04 10:41:45 28 4
gpt4 key购买 nike

有没有一种快速的方法来计算出现在多个向量之一中的值也出现在多个其他向量中的次数?这是一个例子:

library(data.table)
names<-c(rep('apple',4),rep('banana',3),rep('cantalope',2),'date')
set.seed(38291)
v1<-data.table(municipality=rep('A',6),village=rep('1',6),
last=sample(names,6,replace=TRUE),
middle=sample(names,6,replace=TRUE),id=c(1:6))
v2<-data.table(municipality=rep('A',4),village=rep('2',4),
last=sample(names,4,replace=TRUE),
middle=sample(names,4,replace=TRUE),id=c(7:10))
v1
# municipality village last middle id
# 1: A 1 banana cantalope 1
# 2: A 1 cantalope banana 2
# 3: A 1 cantalope cantalope 3
# 4: A 1 apple apple 4
# 5: A 1 banana apple 5
# 6: A 1 apple apple 6
v2
# municipality village last middle id
# 1: A 2 date cantalope 7
# 2: A 2 apple date 8
# 3: A 2 cantalope banana 9
# 4: A 2 apple cantalope 10
DT = rbind(v1, v2)

我想计算村庄 1 和村庄 2 中个人之间的家庭联系数量。跨村庄的家庭联系由个人的姓或中间名(“last”或“middle”)是否与某人的姓匹配来定义或另一个村庄的中间名。在此示例中,居住在村庄 1 的 id=1 的个人在村庄 2 中有三个家庭成员(id 为 7、9 和 10 的人),因为他与他们至少共享一个名字。然后,我想创建一个村庄的二元数据集,其中村庄之间的联系由跨越这些村庄的家庭联系数定义。因此,在此示例中,最终数据集将如下所示:

dyads<-data.table(v1='1',v2='2',ties=3+3+3+2+3+2)
dyads
v1 v2 ties
1: 1 2 16

有没有一种有效的方法来计算这个“关系”数?我编写了一个效率低下的 for 循环来执行此操作,但我有一个庞大的数据集(约 40000 个村庄的 5000 万人)。

最佳答案

受弗兰克回答启发的更新:

meltDT = 
#use unique to eliminate last+middle duplication
unique(melt(DT, measure.vars = c('last', 'middle'),
id.vars = c('village', 'id'), value.name = 'name'),
by = c('village', 'id', 'name'))

#framework of output -- one row for each pair of villages
out.dt = with(DT, CJ(village, village, unique = TRUE))[V2 > V1]

setkey(meltDT, village)
setindex(meltDT, name)
#set indices to facilitate merges on names
out.dt[ , {
ties :=
#unique here eliminates matching on both last & middle
uniqueN(meltDT[.(.BY$V1)][meltDT[.(.BY$V2)], on = 'name',
allow.cartesian = TRUE, nomatch = 0L],
by = c('id', 'i.id'))
}, by = .(V1, V2)]
out.dt
# V1 V2 ties
# 1: 1 2 16

关于R (data.table) : Fast counts of value matches in multiple column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43645796/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com