簡體   English   中英

從R中的數據幀制作三字母組

[英]making trigrams from a dataframe in R

我想在第二列與數據幀的第一列中找到匹配的元素,並使用匹配的元素作為三元組的中間元素來創建三元組。 在不匹配的情況下,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。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM