我想在第二列中找到与数据框的第一列匹配的元素,并使用匹配的元素作为trigram的中间元素创建三元组。如果不匹配,则trigram的中间和最后一个元素将是不匹配的第二列元素。这是一个例子:
gdf <- data.frame(from=c(1,2,3,4,5),to=c(2,3,1,5,6),stringsAsFactors=FALSE)
gdf
# from to
# 1 2
# 2 3
# 3 1
# 4 5
# 5 6
输出三元组如下:
from middle to
1 2 3
2 3 1
3 1 2
4 5 6
5 6 6
我的for循环代码需要很长时间才能处理我庞大的数据集。我的数据集有54304行。
这就是我写的:
num <- nrow(gdf)
df2 <- data.frame(from=character(0),middle=character(0),to=character(0),stringsAsFactors=FALSE)
count <- rep(0,nrow(gdf))
for(row in 1:nrow(gdf)){
for(rowc in 1:nrow(gdf)){
if(gdf[rowc,]$from==gdf[row,]$to){
df2[nrow(df2)+1,]<-c(gdf[row,]$from,gdf[row,]$to,gdf[rowc,]$to)
count[row]<-row
}
}
if(count[row]==0){
df2[nrow(df2)+1,]<-c(gdf[row,]$from,gdf[row,]$to,gdf[row,]$to)
}
}
非常感谢任何帮助!
答案 0 :(得分:0)
不确定您的示例是否过于简单,无法在真实数据集中使用,但是简单的合并适用于该示例,然后我对列进行排序以使它们按顺序返回,因为合并会放置您合并的列作为第1栏。
Merged <- merge(gdf,gdf,by.x="to",by.y="from")[,c(2,1,3)]
然后,您可以稍后使用行绑定
添加nomatch元素rbind(Merged,gdf[! paste(gdf[,1],gdf[,2]) %in% paste(Merged[,1],Merged[,2]),][,c(1,2,2)])