从R中的数据帧制作三元组

时间:2014-03-11 05:58:02

标签: r dataframe

我想在第二列中找到与数据框的第一列匹配的元素,并使用匹配的元素作为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) 
  } 
} 

非常感谢任何帮助!

1 个答案:

答案 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)])