我有一个包含4列的数据框。
m <-c(1,2,3,4)
e <-c('01/01/1970', '02/01/1981','03/05/1986','01/01/1970')
z <-c(111,123, 151, 111)
l <-c('XAR', 'XAR', 'XUI','XUI' )
q <-c(673, 673, 304, 455)
df <- data.frame(m,e,z,l,q)
我需要创建一个描述行之间关系的新df 如果行匹配4个字段中的任何2个中的其他行,则存在关系
例如:
在这种情况下产生的df将是:
在我的生产数据中有700,000行。我试图使用SQL解决这个问题,但函数的递归性质使得它对于生产目的来说太慢了
我想知道R / R包是否有任何图形功能可以实现这一点。
答案 0 :(得分:1)
不完全清楚您期望的输出。
在任何情况下,data.table
都可以轻松快速地识别具有共同值的行:
library(data.table)
# convert your data frame into data table
setDT(df)
# create common id for rows with same values in 'e' AND 'z'
df[, id_ez :=.GRP, by=.(e,z)]
# create common id for rows with same values in 'l' AND 'q'
df[, id_lq :=.GRP, by=.(l,q)]
> head(df)
> m e z l q id_ez id_lq
> 1: 1 01/01/1970 111 XAR 673 1 1
> 2: 2 02/01/1981 123 XAR 673 2 1
> 3: 3 03/05/1986 151 XUI 304 3 2
> 4: 4 01/01/1970 111 XUI 455 1 3
现在您可以获得一个两列输出,告诉您哪个&#39; m&#39;喜欢每个id
df[, .(m_linked=paste(m)), by=id_ez]
> id_ez m_linked
> 1: 1 1
> 2: 1 4
> 3: 2 2
> 4: 3 3
如果要将此表格转换为向量列表:
mysplit = split(a$V1, a$id_ez)
myresult = lapply(mysplit, as.character)
> myresult
$`1`
[1] "1" "4"
$`2`
[1] "2"
$`3`
[1] "3"